C#학습노트(一): 범용, lambda 표현식과 linq

3402 단어 C#학습노트
(1) 일반형
범용 클래스 실례화 이론 C#범용 클래스를 컴파일할 때 선생은 중간 코드인 IL이 되고 통용 유형 T는 단지 자리 차지 문자일 뿐이다.실례화 클래스에서 사용자가 지정한 데이터 형식에 따라 T를 대체하고 실시간 컴파일러(JIT)에 의해 로컬 코드를 생성한다. 이 로컬 코드에는 실제 데이터 형식이 사용되고 실제 형식으로 쓴 클래스와 같기 때문에 서로 다른 폐쇄 클래스의 로컬 코드는 다르다.
일반 클래스에서의 데이터 형식의 제약
범용 목록의 어떤 항목을 검사해서 그것이 유효한지 확인하거나 다른 항목과 비교하려면 컴파일러는 어느 정도에 호출해야 하는 연산자나 방법이 클라이언트 코드가 지정할 수 있는 모든 종류의 매개 변수의 지지를 받을 수 있도록 보장해야 한다.이런 보증은 범형류 정의에 대해 한 개 이상의 제약을 적용함으로써 얻어진 것이다.
C#2.0에는 제약 범위형 데이터 형식의 키워드:where,new,class,struct가 도입되었다.
예:
1.
	public calss A where T:IA
		where V: IA,IB {……}

클래스 A는 범용 T가 IA로부터 상속되어야 하며 V는 IA, IB로부터 상속되어야 한다고 제약한다
2. 클래스 A에서 T를 다시 실례화해야 한다면 이렇게 쓸 수 있다
	public calss A where T:B, new()
		where V: IA {……}

여기 클래스 B는 반드시 무참한 구조 함수가 있어야 한다
3. T를 값 형식이나 인용 형식으로 제약하려면 키워드class와 struct를 사용하면 된다
	public calss A where T:class
		where V: struct {……}

4. 원시 유형 구속
	class List
	{
    		void Add(List items) where U : T {/*...*/}
	}

위의 예에서 T는 Add 메서드의 컨텍스트에서 원본 유형 구속이고 List 클래스의 컨텍스트에서는 바인딩되지 않은 유형 매개변수입니다.
(2) lambda 표현식
Lambda 표현식은 위임 또는 표현식 디렉토리 트리 유형을 만드는 데 사용할 수 있는 익명 함수입니다.lambda 표현식을 사용하면 매개 변수로 전달되거나 함수 호출값으로 되돌아올 수 있는 로컬 함수를 쓸 수 있습니다.Lambda 표현식은 LINQ 질의 표현식을 작성하는 데 특히 유용합니다.Lambda 표현식을 만들려면 Lambda 연산자=> 왼쪽에 입력 매개변수(있는 경우)를 지정한 다음 다른 쪽에 표현식이나 문 블록을 입력해야 합니다.예를 들어 lambda 표현식 x=>x*x는 x라는 매개 변수를 지정하고 x의 제곱값을 되돌려줍니다.다음 예제에서 볼 수 있듯이 이 표현식을 위임 유형에 지정할 수 있습니다.
	delegate int del(int i);
	static void Main(string[] args){
    		del myDelegate = x => x * x;
    		int j = myDelegate(5); //j = 25
	}

표현식 트리
제가 직접 쓴 lambda 표현식을 표현식 트리로 바꾸는 예를 보여 드릴게요.
            //var ints = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
            //var r = ints.Where(i=>(i>5&&i<=7)||(i==3));
            var ints = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
            var p = Expression.Parameter(typeof(int),"i");
            var bin1 = Expression.GreaterThan(p, Expression.Constant(5));
            var bin2 = Expression.LessThan(p, Expression.Constant(7));
            var bin3 = Expression.Equal(p, Expression.Constant(3));
            var body = Expression.And(bin1,bin2);
            body = Expression.Or(body,bin3);
            var lambda = Expression.Lambda>(body,p);
            var r = ints.Where(lambda.Compile());

표현식 수에 대한 자세한 내용은 블로그로 이동하십시오.http://www.cnblogs.com/renjuwht/archive/2011/02/27/1966111.html
그중에서도 표현식 트리라는 구조를 왜 사용해야 하는지에 대한 의문이 해결되었다.
(3) linq
linq에 대해서 이런 데이터베이스와 유사한 linq 조회를 말하고 싶습니다.
	queryName = from e in db.employeeInfoList
                            where e.employeeName.Equals(name)
                            select e;

사실 로컬은 상기 코드를 실행하지 않고 표현식 트리를 구축하여 sql문장으로 변환하여 네트워크를 통해 데이터베이스 서비스 프로그램에 보냅니다.

좋은 웹페이지 즐겨찾기