2013-04-26 25 views
6

Cây biểu thức có phải là một tính năng ngôn ngữ cốt lõi hoặc một tính năng của đối tượng/thư viện BCL không? Có điều gì đó mà bạn không thể xây dựng mà không có các tính năng ngôn ngữ cốt lõi của C#?Cây biểu thức có phải là tính năng ngôn ngữ cốt lõi của C# không?

+4

Trong phạm vi có một diễn viên tiềm ẩn từ một lambda của biểu mẫu 'Func 'tới' Biểu thức > 'mà trình biên dịch phải làm lúc biên dịch, tôi nghĩ vậy. –

+1

Bạn có thể sử dụng các phương thức trình xây dựng thay vì dịch biểu thức lambda thành cây biểu thức. Nhưng nó * rất nhiều * tiết hơn. – CodesInChaos

+0

Bạn đang hỏi về phần nào của tính năng này? – SLaks

Trả lời

3

Không, cây biểu thị không phải là tính năng ngôn ngữ. Chúng có thể sử dụng được từ bất kỳ ngôn ngữ .NET nào để chúng không thể được C# cụ thể. Chúng là các kiểu CLR bình thường được định nghĩa trong một assembly tích hợp.

Việc xây dựng thông qua biểu thức lambda (và LINQ) là C# cụ thể. Nhưng bạn luôn có thể xây dựng một cách thủ công tương đương Expression. Trình biên dịch C# không làm gì hơn là phát ra các cuộc gọi đến các phương thức xây dựng tĩnh nổi tiếng Expression. Bạn có thể kiểm tra những gì trình biên dịch phát ra bằng cách giải mã nhị phân với Reflector được cấu hình cho một phiên bản .NET cũ.

Cho dù cây biểu thức sử dụng API nội bộ .NET Framework là một câu hỏi không liên quan, nhưng tôi không thể nghĩ ra bất kỳ lý do nào khiến chúng cần.

+1

"Không, chúng không phải là một tính năng ngôn ngữ. Chúng có thể sử dụng được từ bất kỳ ngôn ngữ .NET nào để chúng không thể là C# cụ thể". - Điều này không đúng. Họ * là * một tính năng ngôn ngữ của C# ... và F # ... và Visual Basic ... ---- Mỗi nhu cầu phải biết cú pháp ngôn ngữ và thực sự tạo ra một cây biểu thức từ văn bản trong tệp nguồn của bạn. –

+1

@Timothy: Không, bạn đang tham chiếu đến _lambda expressions_. _Those_ là các tính năng ngôn ngữ. Các lớp 'Expression' chỉ là các lớp .NET thông thường. Bất cứ thứ gì có thể sử dụng các lớp .NET đều có thể sử dụng các lớp 'Expression'. –

+0

@JeffMercado Oh ... đúng. Tôi đã nghĩ câu hỏi ban đầu là về tính năng lambda-expression-to-'Expression', không phải là các lớp 'Expression'. Có, đó không phải là tính năng ngôn ngữ. :) –

0

Như bạn có thể thấy từ định nghĩa lớp học Expression, nó được xác định trong không gian tên System.Linq.Expressions. Điều này, Biểu thức không phải là một tính năng ngôn ngữ C# - đó là một lớp có thể được tiêu thụ bởi tất cả các ngôn ngữ nhắm vào CLR.

Ở đây, ví dụ, là một bài viết trên MSDN có tiêu đề "Expression Trees (C# and Visual Basic)" minh họa cách tạo và sử dụng cây biểu thức bằng C# và VB.NET.

Các vấn đề liên quan