Đại biểu: Dự đoán so với hành động so với Func


137

Ai đó có thể cung cấp một lời giải thích tốt (hy vọng với các ví dụ) của 3 đại biểu quan trọng nhất này:

  • Thuộc tính
  • Hoạt động
  • Func

Câu trả lời:


180
  • 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.


3
Cũng có System.Converter<TInput, TOutput>, mặc dù nó hiếm khi được sử dụng.
G-Wiz

4
Trình chuyển đổi là một đại biểu tốt khi cần rất nhiều Chuyển đổi mô hình thành các lớp nghiệp vụ, ví dụ: stum.de/2009/12/23/ợi
Michael Stum

EventHandler/EventHandler<T>cũng xuất hiện ở bên ngoài WinForms.
Andy

@Andy: Hơi ... Nhưng chẳng hạn như trong WPF chẳng hạn. Tôi đồng ý rằng không có gì dành riêng cho WinForms.
Jon Skeet

48

Action, FuncPredicatetấ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>.


Câu trả lời TỐT NHẤT và ĐƠN GIẢN mà tôi đã tìm thấy liên quan đến câu hỏi này
Reyan Chougle

@ReyanChougle: Vui mừng, bạn thấy nó hữu ích.
Rahul Garg

9

Ngoài câu trả lời của Jon, còn có

  • Converter<TInput, TOutput>: Về cơ bản Func<TInput, TOutput>, nhưng với ngữ nghĩa. Được sử dụng bởi List.ConvertAll và Array.ConvertAll, nhưng cá nhân tôi chưa thấy nó ở bất kỳ nơi nào khác.

4

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.


3

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.


2

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();

2

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

2

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.