2013-02-23 67 views
8

:Sự khác biệt giữa các cách khác nhau để khởi tạo một đại biểu (Func <T, T>)?

Func<int, int> myFunc = new Func<int,int>(delegate(int x) { 
    return x + 1; 
}); 

:

Func<int, int> myFunc = delegate(int x) { 
    return x + 1; 
}; 

:

Func<int, int> myFunc = x => x + 1; 

sự khác biệt giữa chúng là gì?

+0

trùng lặp của [đại biểu từ khóa so với ký pháp lambda] (http://stackoverflow.com/questions/208381/whats-the-difference-between-anonymous-methods-c-2-0- và-lambda-biểu thức) và [Sự khác nhau giữa hành động mới() và lambda là gì?] (http://stackoverflow.com/questions/765966/what-is-the-difference-between-new-action-and -a-lambda) – nawfal

Trả lời

7

Chúng đều giống nhau. Hai ví dụ đầu tiên là ví dụ về anonymous methods. Cuối cùng là một ví dụ về lambda expression. Các phương thức ẩn danh và biểu thức lambda được gọi chung là các chức năng ẩn danh.

Phương pháp vô danh đã được giới thiệu trong C# 2; biểu thức lambda đã được giới thiệu trong C# 3 và chủ yếu là thay thế các phương thức nặc danh. Lưu ý rằng biểu thức lambda cũng có thể được chuyển đổi thành expression trees đại diện cho mã dưới dạng dữ liệu thay vì IL, cũng như các đại biểu.

Lưu ý rằng Func<TResult>, Func<T, TResult> v.v ... chỉ là ví dụ về các loại đại biểu. Bạn có thể chuyển đổi các chức năng ẩn danh thành bất kỳ loại đại biểu tương thích nào. Ví dụ:

public delegate int Foo(string x); 

Foo foo = text => text.Length; 
+0

Vậy sự khác biệt giữa chức năng ẩn danh và Func là gì? Họ có giống nhau không? –

+0

@Lior: 'Func' chỉ là tên của một loại đại biểu. –

+0

cảm ơn bạn rất nhiều :) –

8

Tất cả đều giống nhau - chỉ syntactic sugar biên dịch thành cùng một thứ.

Tức là - với suy luận kiểu và các tính năng biên dịch khác, 3 chỉ là một cách rất ngắn để nói 1.

+0

Vậy sự khác nhau giữa hàm ẩn danh và Func là gì? Chúng có giống nhau không? –

+0

@Lior - 'Func' là một đại biểu được xác định. Một hàm ẩn danh không có kiểu ủy nhiệm có tên. – Oded

+0

@Lior, Có chúng giống nhau trong thời gian chạy nhưng có sự khác biệt trong cách bạn định nghĩa chúng để làm cho trình biên dịch hiểu rằng một đại biểu của nó chấp nhận nhiều kiểu tham số cụ thể và trả về một kiểu cụ thể. – Somnath