没有返回类型的Func委托

时间:2009-05-27 19:21:42

标签: c# .net

所有Func委托都返回一个值。什么是可以与返回void的方法一起使用的.NET委托?

7 个答案:

答案 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>不接受任何参数并返回值。如果您不想返回值,请使用ActionAction<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());
    }  
}