람다식이 리플렉션을 사용한다는 것을 누군가가 확인할 수 있는지 이해하고 있는지 확인하려면?람다식이 리플렉션을 사용합니까?
답변
그들은 할 수는 있지만 필수는 아닙니다. 델리게이트로 컴파일 된 경우 반영 할 필요가 없습니다. 그러나 ab 표현 트리로 컴파일 된 경우 리플렉션 기반 트리입니다. 표현 트리의 일부는 메타 데이터 토큰 (ldtoken)에서 직접 어셈블 할 수 있습니다 - 특히 메소드 (연산자와 getter/setter 및 유형 포함) - 그러나 다른 일부 은이 될 수 없습니다. 이것은 (PropertyInfo
는 토큰에 의해 로딩 될 수없는) 특성을 포함한다 - 따라서 IL 컴파일 된 람다 명시 GetProperty
등
를 포함 할 수 있지만, (토큰 또는 반사) 가가 표현된다 식 트리로드 그러나 반사 (MemberInfo
, 등). 나중에 컴파일 될 수도 있고 공급자가 분석 할 수도 있습니다.
표현식 컴파일러는 성능 향상을 위해 표현식 트리의 일부 또는 전부를 캐싱하고 다시 사용할 수 있습니다.
람다 식은 대리자를 만들기위한 컴파일러 구문 설탕입니다. 여기서 반사가 사용되지 않았습니다.
아니요, 람다의 두 가지 결과가 있습니다. 표현식 트리는 근본적으로 대체를 기반으로합니다. –
람다 식은 익명 함수 또는 식 트리 중 하나로 컴파일러에서 처리됩니다. 리플렉션은 런타임에만 수행 될 수 있기 때문에 컴파일러가 두 경우 모두 무엇을하는지 고려할 때 리플렉션을 전혀 사용하지 않습니다.
런타임에 람다 표현식은 매우 구체적인 상황에서 사용되는 반사가 발생할 수 있습니다 익명 함수의
을 : 당신이 명시 적으로 뭔가에 반영하는 익명 함수를 작성하는 경우 호출 할 때 다음 람다가 반사를 수행합니다. 이것은 물론 "올바른"방법에서 반영한 것과 같습니다. 식 나무의
(TDelegate
대한 일부 타입의 Expression<TDelegate>
즉 값) 다음 query provider 사용되고 반사 될 가능성이있는 IQueryable
작업시 런타임들을 사용. 예를 들어, 당신이 가정 :
var user = new User { Id = 42 };
var posts = Queryable.Posts.Where(p => p.UserId == user.Id);
posts
쿼리 제공자를 구체화되기 직전에이 변수 user
의 Id
동일한 UserId
와 그 게시물을 발견해야한다고 본다. 이 id는 런타임에 특정 알려진 값을 가지고 있기 때문에 쿼리 공급자는 user
밖으로 낚시를 가져와야합니다. 그 일을 결정할 수있는 한 가지 방법은 반성을 통한 것입니다.
나중에 사용하는 방법에 관계없이 표현 트리는 근본적으로 반영의 관점에서 표현됩니다. –
@MarcGravell : 나는 추론을 이해할 수있다. 그러나 EF에서'Posts.Where (p => p.IsDeleted)'와 같은 기술을 습득하면 실제 반성이 일어나지 않을 것이다 ... 어떤 경우 든, 대답이 개선 될 필요가 있다고 생각하면 제안에 대한 의견을 제시하십시오. – Jon
그것은 GetValue 등을 호출하지 않을 것입니다. 그러나 표현식 트리 자체를 작성하는 것은 다음과 같습니다 : reflection-based –
- 1. datacontract 직렬화가 리플렉션을 사용합니까?
- 2. typeof (myType) .TypeHandle이 리플렉션을 사용합니까?
- 3. ASP.NET MVC의 JsonResult가 리플렉션을 사용합니까
- 4. 람다식이 잘못되었습니다.
- 5. 캐슬 프로젝트 DynamicProxy는 리플렉션을 많이 사용합니까?
- 6. Java에서 Arrays.copyOf 소스 코드가 왜 리플렉션을 사용합니까?
- 7. 입력 된 데이터 세트는 런타임에 리플렉션을 사용합니까?
- 8. 람다식이 아닌 파이썬 정렬
- 9. 람다식이 란 무엇입니까?
- 10. 이 람다식이 가능합니까?
- 11. C# 클로저에 람다식이 있습니까?
- 12. 람다식이 컴파일되지 않습니다.
- 13. 람다식이 Java 8에서 작동하지 않습니까?
- 14. 람다식이 람다 식이라고하는 이유는 무엇입니까?
- 15. 람다식이 필요 OrderBy DateTime 변환
- 16. 중복 된 람다식이 동일한 생성 된 코드로 해석됩니까?
- 17. 리플렉션을 고려해야합니까?
- 18. 람다식이 함수 포인터로 전달 될 수 있습니까?
- 19. 람다식이 부울을 NotSupportedException에서 false로 비교 함
- 20. C# 람다식이 예상 결과를 반환하지 않음
- 21. 비동기식 람다식이 대기 태스크와 함께 반환됩니까?
- 22. HTMLAgilityPack 표현식에 람다식이 포함될 수 없습니다.
- 23. 복잡한 람다식이 매개 변수로 조롱 된 개체
- 24. C# 리플렉션을 사용하여 필드 가져 오기
- 25. 리플렉션을 사용하여 종속성 작업
- 26. 리플렉션을 사용하여 배열 풀기
- 27. 리플렉션을 사용하여 클래스 인스턴스화
- 28. 리플렉션을 사용하여 클래스 인스턴스화
- 29. 리플렉션을 사용하여 GetComponent
- 30. j2objc는 실제로 리플렉션을 지원합니까?
아니요, 그렇지만 Linq (람다 식과 함께 자주 사용되는)는 않습니다. –
LINQ가 반드시 리플렉션을 사용하는 것은 아닙니다. – Rawling
나는 부인할 수있다. 그들은 반성과 아무 관련이 없습니다. http://stackoverflow.com/a/3844487/44620 –