2012-11-20 2 views
3

람다식이 리플렉션을 사용한다는 것을 누군가가 확인할 수 있는지 이해하고 있는지 확인하려면?람다식이 리플렉션을 사용합니까?

+2

아니요, 그렇지만 Linq (람다 식과 함께 자주 사용되는)는 않습니다. –

+4

LINQ가 반드시 리플렉션을 사용하는 것은 아닙니다. – Rawling

+2

나는 부인할 수있다. 그들은 반성과 아무 관련이 없습니다. http://stackoverflow.com/a/3844487/44620 –

답변

3

그들은 할 수는 있지만 필수는 아닙니다. 델리게이트로 컴파일 된 경우 반영 할 필요가 없습니다. 그러나 ab 표현 트리로 컴파일 된 경우 리플렉션 기반 트리입니다. 표현 트리의 일부는 메타 데이터 토큰 (ldtoken)에서 직접 어셈블 할 수 있습니다 - 특히 메소드 (연산자와 getter/setter 및 유형 포함) - 그러나 다른 일부 이 될 수 없습니다. 이것은 (PropertyInfo는 토큰에 의해 로딩 될 수없는) 특성을 포함한다 - 따라서 IL 컴파일 된 람다 명시 GetProperty

를 포함 할 수 있지만, (토큰 또는 반사) 가 표현된다 식 트리로드 그러나 반사 (MemberInfo, 등). 나중에 컴파일 될 수도 있고 공급자가 분석 할 수도 있습니다.

표현식 컴파일러는 성능 향상을 위해 표현식 트리의 일부 또는 전부를 캐싱하고 다시 사용할 수 있습니다.

0

람다 식은 대리자를 만들기위한 컴파일러 구문 설탕입니다. 여기서 반사가 사용되지 않았습니다.

+1

아니요, 람다의 두 가지 결과가 있습니다. 표현식 트리는 근본적으로 대체를 기반으로합니다. –

1

람다 식은 익명 함수 또는 식 트리 중 하나로 컴파일러에서 처리됩니다. 리플렉션은 런타임에만 수행 될 수 있기 때문에 컴파일러가 두 경우 모두 무엇을하는지 고려할 때 리플렉션을 전혀 사용하지 않습니다.

런타임에 람다 표현식은 매우 구체적인 상황에서 사용되는 반사가 발생할 수 있습니다 익명 함수의

을 : 당신이 명시 적으로 뭔가에 반영하는 익명 함수를 작성하는 경우 호출 할 때 다음 람다가 반사를 수행합니다. 이것은 물론 "올바른"방법에서 반영한 것과 같습니다. 식 나무의

(TDelegate 대한 일부 타입의 Expression<TDelegate> 즉 값) 다음 query provider 사용되고 반사 될 가능성이있는 IQueryable 작업시 런타임들을 사용. 예를 들어, 당신이 가정 :

var user = new User { Id = 42 }; 
var posts = Queryable.Posts.Where(p => p.UserId == user.Id); 

posts 쿼리 제공자를 구체화되기 직전에이 변수 userId 동일한 UserId와 그 게시물을 발견해야한다고 본다. 이 id는 런타임에 특정 알려진 값을 가지고 있기 때문에 쿼리 공급자는 user 밖으로 낚시를 가져와야합니다. 그 일을 결정할 수있는 한 가지 방법은 반성을 통한 것입니다.

+0

나중에 사용하는 방법에 관계없이 표현 트리는 근본적으로 반영의 관점에서 표현됩니다. –

+0

@MarcGravell : 나는 추론을 이해할 수있다. 그러나 EF에서'Posts.Where (p => p.IsDeleted)'와 같은 기술을 습득하면 실제 반성이 일어나지 않을 것이다 ... 어떤 경우 든, 대답이 개선 될 필요가 있다고 생각하면 제안에 대한 의견을 제시하십시오. – Jon

+0

그것은 GetValue 등을 호출하지 않을 것입니다. 그러나 표현식 트리 자체를 작성하는 것은 다음과 같습니다 : reflection-based –

관련 문제