Câu trả lời:
Predicate
: về cơ bản Func<T, bool>
; đặt câu hỏi "đối số được chỉ định có thỏa mãn điều kiện được đại diện bởi đại biểu không?" Được sử dụng trong những thứ như List.Find ALL.
Action
: Thực hiện một hành động đưa ra các đối số. Mục đích rất chung chung. Về cơ bản, không được sử dụng nhiều trong LINQ vì nó ngụ ý tác dụng phụ.
Func
: Được sử dụng rộng rãi trong LINQ, thường để chuyển đổi đối số, ví dụ: bằng cách chiếu một cấu trúc phức tạp thành một thuộc tính.
Các đại biểu quan trọng khác:
EventHandler
/ EventHandler<T>
: Được sử dụng trên tất cả WinForms
Comparison<T>
: Thích IComparer<T>
nhưng ở dạng đại biểu.
EventHandler/EventHandler<T>
cũng xuất hiện ở bên ngoài WinForms.
Action
, Func
và Predicate
tất cả thuộc về gia đình đại biểu.
Action
: Hành động có thể mất n tham số đầu vào nhưng nó trả về void.
Func
: Func có thể lấy n tham số đầu vào nhưng nó sẽ luôn trả về kết quả của loại được cung cấp. Func<T1,T2,T3,TResult>
, ở đây T1, T2, T3 là các tham số đầu vào và TResult là đầu ra của nó.
Predicate
: Vị ngữ cũng là một dạng của Func nhưng nó sẽ luôn trả về bool. Nói một cách đơn giản, nó là bao bọc của Func<T,bool>
.
MethodInvoker là một phương thức mà các nhà phát triển WinForms có thể sử dụng; nó chấp nhận không có đối số và không trả lại kết quả. Nó có trước Action và vẫn thường được sử dụng khi gọi lên giao diện người dùng kể từ BeginInvoke () et al chấp nhận một Đại biểu chưa được kiểm tra; mặc dù hành động sẽ làm tốt như vậy.
myForm.BeginInvoke((MethodInvoker)delegate
{
MessageBox.Show("Hello, world...");
});
Tôi cũng sẽ biết về ThreadStart và ParameterizedThreadStart; một lần nữa hầu hết mọi người sẽ thay thế một hành động trong những ngày này.
Vị ngữ, Func và Action là các phiên bản ủy nhiệm sẵn có của .NET. Mỗi trường hợp đại biểu này có thể tham chiếu hoặc trỏ đến các phương thức người dùng với chữ ký cụ thể.
Đại biểu hành động - Các trường hợp ủy nhiệm hành động có thể trỏ đến các phương thức lấy tham số và trả về khoảng trống.
Đại biểu Func - Ví dụ đại biểu Func có thể trỏ đến (các) phương thức lấy số lượng đối số thay đổi và trả về một số loại.
Vị ngữ - Vị ngữ tương tự như các thể hiện ủy nhiệm func và chúng có thể trỏ đến các phương thức lấy số lượng đối số thay đổi và trả về kiểu bool.
Hành động và Func với lambda:
person p = new person();
Action<int, int> mydel = p.add; /*(int a, int b) => { Console.WriteLine(a + b); };*/
Func<string, string> mydel1 = p.conc; /*(string s) => { return "hello" + s; };*/
mydel(2, 3);
string s1= mydel1(" Akhil");
Console.WriteLine(s1);
Console.ReadLine();
Func thân thiện hơn với LINQ, có thể được truyền vào dưới dạng tham số. (điểm miễn phí)
Vị ngữ không thể, phải được bọc lại.
Predicate<int> IsPositivePred = i => i > 0;
Func<int,bool> IsPositiveFunc = i => i > 0;
new []{2,-4}.Where(i=>IsPositivePred(i)); //Wrap again
new []{2,-4}.Where(IsPositivePred); //Compile Error
new []{2,-4}.Where(IsPositiveFunc); //Func as Parameter
Một ví dụ đơn giản về các đối số và những gì liên quan đến từng loại
Func này nhận hai đối số int và trả về một int.Func luôn có kiểu trả về
Func<int, int, int> sum = (a, b) => a + b;
Console.WriteLine(sum(3, 5));//Print 8
Trong trường hợp này, func không có đối số nhưng trả về một chuỗi
Func<string> print = () => "Hello world";
Console.WriteLine(print());//Print Hello world
Hành động này có hai đối số int và trả về void
Action<int, int> displayInput = (x, y) => Console.WriteLine("First number is :" + x + " , Second number is "+ y);
displayInput(4, 6); //Print First number is :4 , Second number is :6
Vị ngữ này lấy một đối số và luôn trả về bool. Các vị ngữ chung luôn trả về bool.
Predicate<int> isPositive = (x) => x > 0;
Console.WriteLine(isPositive(5));//Print True
System.Converter<TInput, TOutput>
, mặc dù nó hiếm khi được sử dụng.