Sự khác nhau giữa cây biểu thức và CodeDom là gì? Tôi nên sử dụng kiểu nào?C# 4.0: Cây biểu thị so với CodeDom
Trả lời
Cây biểu thức có nhiều điểm chung với (ví dụ) AST. Nó không ánh xạ trực tiếp đến mã, nhưng rất phù hợp để xây dựng từ các thuật toán. Ví dụ, nếu bạn đang phân tích một công thức:
((a + 2)/b)
đó là:
ParameterExpression a = ..., b = ...
var body = Expression.Divide(
Expression.Add(a, Expression.Constant(2)),
b);
var lambda = Expression.Lambda(body,a,b); // optionally with generics
Trong thực tế, tôi đã làm chính xác này, sử dụng một bộ phân tích rằng xây dựng một cây đối tượng, với các đối tượng tạo hoàn thành expresion thông qua một "khách truy cập" thực hiện. Trong .NET 4.0, sự hỗ trợ cây biểu thức phong phú hơn có thể hỗ trợ hầu hết các kịch bản và biên dịch nó theo yêu cầu.
Một ứng dụng quan trọng của biểu thức là bạn có thể deconstruct họ khi chạy, vì vậy trong mã của bạn bạn có thể có:
Foo(x => x.SomeMethod(1, "abc"));
và trích xuất các phương pháp SomeMethod
-info, 1
và "abc"
, vv
bản đồ công khai mã. Đó là tất cả về các câu lệnh, v.v. rất tương tự như cách bạn viết mã thông thường. Việc sử dụng phổ biến nhất của codedom là để tạo mã, như là một phần của công cụ. Bạn có thể sử dụng nó để biên dịch động, nhưng thành thực mà nói thì khó hơn. Tôi không phải là người hâm mộ. Tính năng thú vị là cây mã số có thể hoạt động với nhiều ngôn ngữ.
Một ứng cử viên khác ở đây phải là DynamicMethod
và/hoặc ILGenerator
. Điều này không bản đồ đến một AST (biểu thức), và không thể được sử dụng để tạo mã nguồn (codedom), nhưng cho phép truy cập đầy đủ vào các công cụ MSIL. Tất nhiên, nó cũng đòi hỏi bạn phải suy nghĩ về ngăn xếp vv, nhưng nó là rất hiệu quả và hiệu quả cho lập trình meta.
Nếu ILGenerator
là quá hard-core, và CodeDOM là một Pita, sau đó tùy chọn khác là thế hệ thời gian chạy của mã như là một chuỗi. Sau đó, vượt qua điều đó thông qua CSharpCodeProvider
để biên dịch nó. Có một số phần của thời gian chạy lõi thực hiện điều này (XmlSerializer
IIRC).
Vì vậy, để tóm tắt:
- meta-lập trình:
ILGenerator
hoặcCSharpCodeProvider
; cũngExpression
trong 4.0 (nhưng điều này là khá hạn chế 3.5) - xử lý AST:
Expression
- phân tích trong thời gian chạy:
Expression
- mã thế hệ bằng nhiều ngôn ngữ: Mã-dom
Cây biểu thức được sử dụng để tạo biểu thức. Tạo mã nguồn khi chạy. CodeDom được sử dụng để biên dịch mã nguồn. Nó phải tồn tại trước khi bạn có thể xây dựng nó. Cây biểu hiện linh hoạt hơn, nhưng khó sử dụng hơn nhiều.
Nếu bạn muốn thêm tập lệnh vào ứng dụng của mình, hãy sử dụng CodeDom. Nếu bạn muốn làm phản chiếu rất tiên tiến và thích, sử dụng cây biểu thức, nhưng tôi không khuyên bạn nên sử dụng nó.
- 1. ArrayAccess so với ArrayIndex trong cây biểu thức
- 2. Các tham số ByRef với cây biểu thức trong C#
- 3. Tạo một cây biểu hiện trong C#
- 4. C# CodeDom Thuộc tính tự động
- 5. Reflection.Emit vs CodeDOM
- 6. Cây biểu thức Java
- 7. Biểu thức Lambda so với Functor trong C++
- 8. Đại biểu so với Hành động, Func trong C#
- 9. LINQ extension SelectMany trong 3.5 so với 4.0?
- 10. XNA 4.0 với C# .NET 4.5?
- 11. cài đặt hiển thị so với ẩn/hiển thị
- 12. CodeDom và Silverlight
- 13. C# Phương pháp động - IL vs cây biểu hiện
- 14. Bảng băm so với cây nhị phân cân bằng
- 15. Cây quyết định so với phân loại Naive Bayes
- 16. C#: Hành động đại biểu so với đại biểu rõ ràng
- 17. Ràng buộc loại CodeDom chung
- 18. Hiển thị hồ sơ NDK ".so không có biểu tượng"
- 19. Các cây biểu hiện LINQ có hoàn thành không?
- 20. "CompileAssemblyFromSource" trong f # powerPack codeDom
- 21. Thành phần so với đoàn đại biểu
- 22. Đọc thuộc tính của đối tượng với cây biểu thức
- 23. Cách tạo biểu đồ cây tương tác với d3?
- 24. Đại biểu so với từ khóa đại biểu
- 25. Chuyển đổi biểu thức lambda vào một cây biểu
- 26. Bitwise Hoặc: C# so với C++
- 27. C++/CLI: Ưu điểm so với C#
- 28. Dòng C++ so với IO kiểu C?
- 29. C++ so với C# loại an toàn
- 30. C Generics # so với C++ templates