所有Func委托都返回一个值。可与返回void的方法一起使用的.NET委托是什么?
所有Func委托都返回一个值。可与返回void的方法一起使用的.NET委托是什么?
Answers:
所有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中定义)的新增功能。
Func<,,, ... ,>
在.NET 4.0中最多增加了16个参数(如果是,还增加了返回类型),但是每个“系列”的最后八种类型都在中定义System.Core.dll
,而不是在中定义mscorlib.dll
,因此这就是原因为什么Michielvoo没有看到他们。但是,.NET 4.5和4.5.1中没有添加更多的Funcs或Action。这个序列会变成A170836还是A170875?敬请关注。
...不带参数,返回类型为void?
我相信这Action
是一个解决方案。
尝试System.Func<T>
并System.Action
Converter<TInput, TOutput>
类似于后者的委托类型Func<T, TResult>
。它用于将a中的List<>.ConvertAll
每个元素投影List<>
到另一个对象,然后将所有“函数值”放在new中的方法List<>
。(后来,人们经常会使用Linq Select
来实现这一点。)
有时,您将需要编写一个用于事件处理的委托,在这种情况下,除了应该从派生的第二个参数之外,您还可以利用System.EvenHandler<T>
其中的一个隐式接受类型object
的参数EventArgs
。EventHandlers将返回void
我个人发现这在测试过程中对在函数体中创建一次性回调很有用。
调用返回值和非返回值子例程的一种非常简单的方法。分别使用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());
}
}