Tất cả các đại biểu Func trả về một giá trị. Các đại biểu .NET có thể được sử dụng với các phương thức trả về void là gì?
Tất cả các đại biểu Func trả về một giá trị. Các đại biểu .NET có thể được sử dụng với các phương thức trả về void là gì?
Câu trả lời:
Tất cả các đại biểu Func trả lại một cái gì đó; tất cả các đại biểu hành động trở về khoảng trống.
Func<TResult>
không có đối số và trả về TResult:
public delegate TResult Func<TResult>()
Action<T>
nhận một đối số và không trả về giá trị:
public delegate void Action<T>(T obj)
Action
là đại biểu đơn giản nhất, "trần trụi":
public delegate void Action()
Cũng có Func<TArg1, TResult>
và Action<TArg1, TArg2>
(và những người khác lên đến 16 đối số). Tất cả những thứ này (ngoại trừ Action<T>
) đều mới đối với .NET 3.5 (được định nghĩa trong System.Core).
Func<,,, ... ,>
) trong .NET 4.0, nhưng tám loại cuối cùng của mỗi "chuỗi" được xác định System.Core.dll
, không phải trong mscorlib.dll
, vì vậy đó sẽ là lý do Tại sao michielvoo không nhìn thấy chúng. Tuy nhiên, không có thêm Func hay Action nào được thêm vào trong phiên bản .NET 4.5 và 4.5.1. Trình tự này sẽ trở thành A170836 hay A170875 ? Giữ nguyên.
... không có đối số và có kiểu trả về void?
Tôi tin Action
là một giải pháp cho việc này.
Tất cả các đại biểu Func đều lấy ít nhất một tham số
Đo không phải sự thật. Tất cả đều lấy ít nhất một đối số loại, nhưng đối số đó xác định loại trả về.
Vì vậy, Func<T>
chấp nhận không có tham số và trả về một giá trị. Sử dụng Action
hoặc Action<T>
khi bạn không muốn trả về một giá trị.
Hãy thử System.Func<T>
vàSystem.Action
Converter<TInput, TOutput>
giống như sau này Func<T, TResult>
. Nó được sử dụng trong List<>.ConvertAll
phương thức chiếu mọi phần tử List<>
vào một đối tượng khác và đặt tất cả các "giá trị hàm" vào một đối tượng mới List<>
. (Sau này, người ta thường sử dụng Linq Select
cho điều đó.)
Đôi khi, bạn sẽ muốn viết một đại biểu để xử lý sự kiện, trong trường hợp đó bạn có thể tận dụng lợi thế System.EvenHandler<T>
đó để chấp nhận một đối số kiểu object
bên cạnh tham số thứ hai xuất phát từ đó EventArgs
. EventHandlers sẽ trở lạivoid
Cá nhân tôi thấy điều này hữu ích trong quá trình thử nghiệm để tạo một cuộc gọi lại một lần trong cơ thể chức năng.
... không có đối số và có kiểu trả về void?
Nếu bạn đang viết System.Windows.Forms
, bạn cũng có thể sử dụng:
public delegate void MethodInvoker()
Một cách rất dễ dàng để gọi các chương trình con giá trị trả về và không trả về. đang sử dụng Func và Action tương ứng. (xem thêm https://msdn.microsoft.com/en-us/l Library / 018hxwa8 (v = vs.110 ) .aspx )
Hãy thử ví dụ này
using System;
public class Program
{
private Func<string,string> FunctionPTR = null;
private Func<string,string, string> FunctionPTR1 = null;
private Action<object> ProcedurePTR = null;
private string Display(string message)
{
Console.WriteLine(message);
return null;
}
private string Display(string message1,string message2)
{
Console.WriteLine(message1);
Console.WriteLine(message2);
return null;
}
public void ObjectProcess(object param)
{
if (param == null)
{
throw new ArgumentNullException("Parameter is null or missing");
}
else
{
Console.WriteLine("Object is valid");
}
}
public void Main(string[] args)
{
FunctionPTR = Display;
FunctionPTR1= Display;
ProcedurePTR = ObjectProcess;
FunctionPTR("Welcome to function pointer sample.");
FunctionPTR1("Welcome","This is function pointer sample");
ProcedurePTR(new object());
}
}