所有Func委托都返回一个值。什么是可以与返回void的方法一起使用的.NET委托?
答案 0 :(得分:675)
所有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中定义)。
答案 1 :(得分:69)
...没有参数,并且有一个void返回类型?
我相信Action
是解决此问题的方法。
答案 2 :(得分:45)
所有Func代表至少采用一个参数
那不是真的。它们都至少采用一个类型参数,但该参数确定了返回类型。
因此Func<T>
不接受任何参数并返回值。如果您不想返回值,请使用Action
或Action<T>
。
答案 3 :(得分:26)
尝试System.Func<T>
和System.Action
答案 4 :(得分:0)
有时您会想要为事件处理编写委托,在这种情况下,您可以利用System.EvenHandler<T>
除了应该派生自的第二个参数之外,它隐式接受object
类型的参数。 EventArgs
。 EventHandlers将返回void
我个人觉得这在测试中有用,可以在函数体中创建一次性回调。
答案 5 :(得分:0)
...没有参数,并且有一个void返回类型?
如果您正在为System.Windows.Forms
撰写文章,您还可以使用:
public delegate void MethodInvoker()
答案 6 :(得分:-2)
调用return和non return value子例程的一种非常简单的方法。分别使用 Func 和操作。 (另见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());
}
}