식 트리와 CodeDom의 차이점은 무엇입니까? 어떤 시나리오에 사용해야합니까?C# 4.0 : 식 트리 대 CodeDom
답변
표현 트리는 (예를 들어) AST과 공통점이 많습니다. 코드에 직접 매핑하지는 않지만 알고리즘을 사용하여 생성하는 것이 매우 쉽습니다. 예를 들어, 수식 구문 분석하는 경우 :
((a + 2)/b)
입니다 :
ParameterExpression a = ..., b = ...
var body = Expression.Divide(
Expression.Add(a, Expression.Constant(2)),
b);
var lambda = Expression.Lambda(body,a,b); // optionally with generics
는 사실, 내가 오브젝트 트리를 구축 파서를 사용하여 정확히이 를 수행 한 객체 생성과를 "방문자"구현을 통한 완벽한 표현. .NET 4.0에서 풍부한 표현 트리 지원을 통해 대부분의 시나리오를 지원하고 필요에 따라 컴파일 할 수 있습니다.
Foo(x => x.SomeMethod(1, "abc"));
및 등 SomeMethod
방법-정보, 1
및 "abc"
를 추출 :
표현의 또 다른 주요 사용은 당신이있을 코드 그렇게 런타임에 그들을 해체 할 수 있다는 것입니다
된 CodeDom은 코드에 매핑됩니다. 그것은 모두 진술 등에 관한 것입니다. 매우은 일반적인 코드 작성 방법과 비슷합니다. 코드 롬의 가장 보편적 인 사용은 툴링의 일부로 코드 생성입니다. 은을 사용하여 동적 편집에 사용하지만 솔직히 말하면 더 어렵습니다. 나는 팬이 아니다. 좋은 특징은 코드 롬 트리 이 일 수 있다는 것입니다.
여기에 또 다른 경쟁자는 DynamicMethod
및/또는 ILGenerator
해야합니다. 이 은이 AST (표현식)에 매핑되지 않으며 소스 코드 (코드 롬)를 생성하는 데 사용할 수 없지만 MSIL 도구에 대한 전체 액세스를 허용합니다. 물론 스택과 관련하여 생각해야하지만, 매우 메타 프로그래밍에 효율적이고 효과적입니다. ILGenerator
만약
너무 하드 코어, 그리고 된 CodeDom은 피타입니다 다음 다른 옵션은 문자열 같은 코드 의 런타임 생성합니다. 그런 다음 CSharpCodeProvider
을 전달하여 컴파일하십시오. 이 작업을 수행하는 핵심 런타임 부분이 있습니다 (XmlSerializer
IIRC).그래서
이 요약 :
- 메타 프로그래밍 :
ILGenerator
또는CSharpCodeProvider
; 4.0도Expression
(그러나 이것은 확실히 3.5 제한) - 처리 AST : 여러 언어로
Expression
- 코드 생성 : 코드 DOM
Expression
표현식 트리는 표현식을 작성하는 데 사용됩니다. 런타임시 소스 코드 작성. CodeDom은 소스 코드를 컴파일하는 데 사용됩니다. 빌드하기 전에 존재해야합니다. 표현식 트리는보다 유연하지만 사용하기가 훨씬 어렵습니다.
응용 프로그램에 스크립팅을 추가하려면 CodeDom을 사용하십시오. 매우 진보 된 리플렉션 등을하고 싶다면, 익스프레션 트리를 사용하십시오. 그러나 권장하지는 않습니다.
- 1. 탐색 식 트리
- 2. C# 테이블 이름을 추출하는 식 트리 탐색
- 3. C# CodeDom 자동 속성
- 4. 쿼리 필터 식 트리 용 파서
- 5. 쿠다 4.0 대 3.2
- 6. 람다 식 대 익명 메서드
- 7. ViewModel 트리 대 자주 업데이트되는 모델 트리
- 8. VB.Net 늦은 바인딩 작업은 식 트리
- 9. CLR 2.0 대 4.0 성능?
- 10. CodeDOM : 속성에 DebuggerStepThroughAttribute 추가
- 11. C# 된 CodeDom 더블 형 참조
- 12. B- 트리 대 해시 테이블
- 13. 해시 트리 대 해시 테이블
- 14. C++ n 트리 트리 라이브러리
- 15. C++ 람다 식
- 16. 람다 식 C# 스위치
- 17. Reg 식 C#
- 18. C# 람다 식 - 도움말
- 19. C# 람다 식 변환
- 20. c, 비트 식, 논리식
- 21. WITH CREATE VIEW 성능 대 공통 테이블 식
- 22. 부 람다 식
- 23. CodeDom 및 컬렉션 초기화 자
- 24. EF 4.0 LINQ 1 대 다수/1 대 1
- 25. HTML 4.0 엔티티 내가 XPath 식 이유를 정확히 모르는
- 26. .NET 4.0 대 이전 버전의 성능 비교
- 27. SQL Server Compact 4.0 대 SQLite
- 28. 학습 XNA 3.1 대 XNA 4.0
- 29. .NET 2.0 대 .NET 4.0 로딩 오류
- 30. 식 트리 linq 매개 변수 값 가져 오기?