C 샤프 3.0

C Sharp 3.0

프로그래밍 언어 C# 버전 3.0은 의 일부로 2007년 11월 19일에 출시되었습니다.NET Framework 3.5.HaskellML 등의 기능적 프로그래밍 언어에서 영감을 얻은 새로운 기능을 포함하고 있으며, 주로 공통 언어 [1]런타임에 Language Integrated Query(LINQ; 언어 통합 쿼리) 패턴이 도입되어 있습니다.그것은 현재 어떤 표준 기관에서도 표준화 되어 있지 않다.

C# 3.0의 기능

LINQ(언어 통합 쿼리)

LINQ는 플레인오브젝트 컬렉션, XML 문서, 데이터베이스 등 다양한 종류의 데이터 소스에 대응하는 Microsoft 고유의 확장 가능한 범용 쿼리 언어입니다.다른 C# 언어 기능과 긴밀하게 통합되어 있습니다.구문은 SQL과 다르지만 SQL에서 차용합니다.예:

인트[] 배열 = { 1, 5, 2, 10, 7 };  // 내림차순으로 정렬된 배열의 모든 홀수의 제곱을 선택합니다. IENumerable< >인트> 질문하다 = 부터 x  배열                          어디에 x % 2 == 1                          오더바이 x 내림차순                          선택한다. x * x; // 결과: 49, 25, 1 

LINQ를 구현하기 위해 다양한 새로운 메서드가 를 통해 많은 컬렉션에 추가되었습니다.System.Linq.Enumerableclass. LINQ 식은 컴파일 전에 이러한 함수를 사용하도록 변환됩니다.때로는 더 강력하거나 직접적이기도 한 대안으로 이러한 기능에 [2]직접 액세스할 수 있습니다.이렇게 하면 아래에서 설명하는 람다 함수를 더 많이 사용할 수 있습니다.다음은 위의 예시와 기능적으로 동일합니다.

IENumerable< >인트> 질문하다 = 배열.어디에(x => x % 2 == 1)     .주문별 내림차순(x => x)     .선택한다.(x => x * x); // 결과: 49, 25, 1 (이전 예에서 정의한 'array' 사용 

오브젝트 이니셜라이저

고객. c = 신규 고객.();  c.이름. = "존'; 

쓸 수 있다

고객. c = 신규 고객. { 이름. = "존' }; 

컬렉션 이니셜라이저

마이리스트 목록. = 신규 마이리스트(); 목록..더하다(1); 목록..더하다(2); 

라고 쓸 수 있다

마이리스트 목록. = 신규 마이리스트 { 1, 2 }; 

라고 가정하면MyList용구System.Collections.IEnumerable그리고 대중이 있다Add메서드를 사용합니다.[3]

로컬 변수 유형 추론

로컬 변수 유형 추론:

변화하다 x = 신규 사전< >스트링, 목록.< >흘러가다>>( ) ; 

와 교환할 수 있다.

사전< >스트링, 목록.< >흘러가다>> x = 신규 사전< >스트링, 목록.< >흘러가다>>( ) ; 

이 기능은 짧은 로컬 변수 선언을 위한 편리한 구문설탕일 뿐만 아니라 익명 유형의 변수 선언에도 필요합니다.그러나 컨텍스트 키워드 "var"는 로컬 변수 선언 내에서만 표시될 수 있습니다.

어나니머스 타입

익명 유형을 사용하면 먼저 유형을 명시적으로 정의할 필요 없이 읽기 전용 속성 집합을 단일 개체로 캡슐화할 수 있습니다.유형 이름은 컴파일러에 의해 생성되며 소스 코드 수준에서는 사용할 수 없습니다.속성 유형은 컴파일러에 의해 추론됩니다.

변화하다 x = 신규 { 이름 = "존',  = "Doe" }; 

익명 유형은 개체에서 직접 파생되는 참조 유형입니다.컴파일러는 응용 프로그램이 액세스할 수 없지만 이름을 지정합니다.공통 언어 런타임의 관점에서 어나니머스 유형은 객체를 제외한 어떤 유형에도 캐스팅할 수 없다는 점을 제외하고는 다른 참조 유형과 다르지 않습니다.

복수의 어나니머스 타입이 같은 수 및 타입의 속성을 같은 순서로 가지는 경우, 컴파일러는 그것들을 같은 타입으로 취급해, 같은 컴파일러에 의해서 생성된 타입 [4]정보를 공유합니다.

람다 식

람다 표현식은 1등급 익명 함수 값을 쓰는 간결한 방법을 제공합니다.다음 C# 2.0 스니펫을 비교합니다.

리스트 Of Foo.어디에(위임하다(푸우 x) { 돌아가다 x.크기 > 10; }); 

다음 C# 3.0에 상당합니다.

리스트 Of Foo.어디에(x => x.크기 > 10); 

위의 예에서 lamda 표현식은 파라미터 및 반환유형에 대한 유형추론을 가진 익명의 위임자에 대한 약어 구문일 뿐입니다.그러나 C# 컴파일러는 사용되는 컨텍스트에 따라 람다를 런타임에 처리할 수 있는 AST로 변환할 수도 있습니다.위의 예에서는 다음과 같습니다.listOfFoo는 단순한 메모리 내 컬렉션이 아니라 데이터베이스 테이블을 둘러싼 래퍼입니다.이 기술을 사용하여 람다 본문을 동등한 SQL 표현으로 변환하여 실행을 최적화할 수 있습니다.어느 쪽이든 lamda 표현식 자체는 코드에서 완전히 동일하게 표시되므로 런타임에 사용되는 방법은 클라이언트에 대해 투과적입니다.

식목

다음과 같은 표현x <= y,a = b + c또는 식 트리를 사용하여 람다 함수 및 기타 복잡한 형식을 동적으로 만들 수 있습니다.대부분의 기능은 클래스의 정적 메서드에 의해 제공됩니다.System.Linq.Expressions.Expression이 네임스페이스에는 이러한 메서드에 의해 생성된 식과 부분식을 소프트웨어 개체로 나타내는 다양한 새로운 클래스도 있습니다.여기에는 다음이 포함됩니다.BinaryExpression이것은, 를 나타낼 수 있습니다.x <= y;LambdaExpression그리고 다른 많은 것들도요.리플렉션 API의 측면과 조합하면 쓰기 및 [5][6]디버깅이 조금 어렵더라도 매우 강력한 도구가 될 수 있습니다.

자동 속성

컴파일러는 개인 인스턴스 변수와 다음과 같은 적절한 접근자 및 변환자를 생성합니다.

일반의 스트링 이름. { 얻다; 사적인 세트; } 

확장 방식

개발자는 확장 메서드를 사용하여 기존 CLR 유형의 공개 계약에 새로운 메서드를 추가할 수 있으며 하위 분류 또는 원래 유형을 다시 컴파일할 필요가 없습니다.실제로 확장법은 정의 밖의 기존 클래스에 새로운 방법을 추가하는 착각을 제공하는 통사 설탕의 한 형태입니다.착시 현상은 인스턴스 방식인 것처럼 호출 가능한 정적 메서드의 정의로 실현됩니다.여기서 콜의 수신자(즉, 인스턴스)는 키워드로 장식된 메서드의 첫 번째 파라미터에 바인딩됩니다.this.

확장 방식의 요건은 다음과 같습니다.

  1. 확장 메서드는 정적 클래스에서 정의해야 합니다.
  2. 확장 메서드는 정적 메서드로 정의해야 합니다.
  3. 확장 메서드의 첫 번째 매개 변수는 다음 형식이어야 합니다.type는 확장되는 유형의 이름입니다.this type parameterName
  4. 확장 메서드는 임의로 다음 파라미터를 정의할 수 있습니다.this파라미터를 지정합니다.

이 예제 클래스는 의 정의와 사용을 보여줍니다.Left문자열 확장 메서드:

일반의 정적인 학급 String Extensions(문자열 확장) {     일반의 정적인 스트링 왼쪽(이것. 스트링 s, 인트 n)     {         돌아가다 s.서브스트링(0, n);     } }   스트링 s = "foo 바"; s.왼쪽(3); // String Extensions와 동일합니다.왼쪽(s, 3)은 "foo"를 반환합니다. 

부분적 방법

부분 메서드를 사용하면 코드 생성기는 메서드 선언을 부분 [7]클래스의 다른 부분에 실제로 구현한 경우에만 컴파일에 포함된 확장 포인트로 생성할 수 있습니다.

레퍼런스

  1. ^ Anderson, Tim (2006-11-14). "C# pulling ahead of Java - Lead architect paints rosy C# picture". Reg Developer. The Register. Retrieved 2007-01-20.
  2. ^ Walther, Stephen (2008). ASP.NET 3.5 Unleashed. Indiana, USA: SAMS. pp. 916–917. ISBN 978-0-672-33011-7. I find that I use method syntax more than query syntax because query syntax is a subset of method syntax.
  3. ^ Torgersen, Mads (2006-10-10). "What is a collection?". The Mellow Musings of Dr. T. Retrieved 2009-06-18.
  4. ^ "Anonymous Types". C# Programming Guide. Microsoft. July 2008. Retrieved 2009-06-18.
  5. ^ Walther, Stephen (2008). ASP.NET 3.5 Unleashed. Indiana, USA: SAMS. pp. 950–952. ISBN 978-0-672-33011-7.
  6. ^ "Expression Trees". .NET Framework Developer's Guide. Microsoft. Retrieved 2009-04-26.
  7. ^ "Partial Classes and Methods". C# Programming Guide. Microsoft. Retrieved 2009-04-28.

외부 링크