所有 Func 代表都返回一些东西;所有的 Action 代表都返回 void。
Func<TResult>
不接受任何参数并返回 TResult:
public delegate TResult Func<TResult>()
Action<T>
接受一个参数并且不返回值:
public delegate void Action<T>(T obj)
Action
是最简单的“裸”委托:
public delegate void Action()
还有 Func<TArg1, TResult>
和 Action<TArg1, TArg2>
(以及其他最多 16 个参数)。所有这些(Action<T>
除外)都是 .NET 3.5 的新内容(在 System.Core 中定义)。
... 不带参数并且返回类型为 void?
我相信 Action
是解决此问题的方法。
所有的 Func 委托都至少有一个参数
这不是真的。它们都至少采用一个类型参数,但该参数决定了返回类型。
所以 Func<T>
不接受任何参数并返回一个值。如果您不想返回值,请使用 Action
或 Action<T>
。
试试 System.Func<T>
和 System.Action
Converter<TInput, TOutput>
,它类似于后来的 Func<T, TResult>
。它在 List<>.ConvertAll
方法中使用,该方法将 List<>
中的每个元素投影到另一个对象上,并将所有“函数值”放在新的 List<>
中。 (后来,人们经常为此使用 Linq Select
。)
调用返回和非返回值子例程的一种非常简单的方法。分别使用 Func 和 Action。 (另见 https://msdn.microsoft.com/en-us/library/018hxwa8(v=vs.110).aspx)
试试这个例子
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());
}
}
有时您会想要为事件处理编写委托,在这种情况下,您可以利用 System.EvenHandler<T>
,它隐式接受类型为 object
的参数以及应从 EventArgs
派生的第二个参数。 EventHandlers 将返回 void
我个人发现这在测试过程中对在函数体中创建一次性回调很有用。
... 不带参数并且返回类型为 void?
如果您正在为 System.Windows.Forms
写作,您还可以使用:
public delegate void MethodInvoker()
不定期副业成功案例分享
Func<,,, ... ,>
的情况下加上返回类型),但是每个“系列”的最后八种类型是在System.Core.dll
中定义的,而不是在 { 5},所以这就是 michielvoo 没有看到它们的原因。但是,.NET 版本 4.5 和 4.5.1 中不再添加 Funcs 或 Actions。这个序列会变成 A170836 还是 A170875?敬请关注。