没有返回类型的Func委托

Mar*_*the 523 .net c#

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

Jas*_*son 714

所有Func代表都会返回一些内容; 所有Action代理都返回void.

Func<TResult> 不接受任何参数并返回TResult:

public delegate TResult Func<TResult>()
Run Code Online (Sandbox Code Playgroud)

Action<T> 接受一个参数但不返回值:

public delegate void Action<T>(T obj)
Run Code Online (Sandbox Code Playgroud)

Action 是最简单的"裸"代表:

public delegate void Action()
Run Code Online (Sandbox Code Playgroud)

还有Func<TArg1, TResult>Action<TArg1, TArg2>(和其他人多达16个参数).所有这些(除了Action<T>)都是.NET 3.5的新手(在System.Core中定义).

  • 在.NET 4.0中,它们现在最多可以有8个参数.如果他们保持这一点,那么在下一个版本中它将上升到11! (84认同)
  • 仅供参考,基类库的下一个版本将包括支持四个以上形式参数的Func和Action类型.我不记得他们到底有多大. (10认同)
  • 实际上,看起来它们在4.0中达到了16. (9认同)
  • 1,4,16,64,256,1024,4096,16384,65536,......这清楚地表明编译器需要能够处理[比函数更多的函数参数](http:/ /stackoverflow.com/questions/12658883/what-is-the-maximum-number-of-parameters-that-ac-sharp-method-can-be-defined-as)在未来的某个时刻! (7认同)
  • 实际上,Tustin2121是正确的,它们在.NET 4.0中上升到16个参数(在"Func <,,, ...,>`的情况下加上一个返回类型),但每个"系列"的最后八种类型是在`System.Core.dll`中定义,而不是在`mscorlib.dll`中,所以这就是michielvoo没有看到它们的原因.但是,.NET版本4.5和4.5.1中不再添加Func或Actions.这个序列会变成[A170836](http://oeis.org/A170836)还是[A170875](http://oeis.org/A170875)?敬请关注. (6认同)
  • 为了方便起见,我提供了一些带有多个参数的重载,但在某种程度上,只需将您的参数包装在一个对象中...... (2认同)

Mar*_*the 75

...没有参数,并且有一个void返回类型?

我相信这Action是一个解决方案.


Joe*_*orn 45

所有Func代表至少使用一个参数

这不是真的.它们都至少采用一个类型参数,但该参数确定了返回类型.

所以不Func<T>接受任何参数并返回一个值.使用ActionAction<T>当您不想返回值时.


Jar*_*Par 27

尝试System.Func<T>System.Action

  • 对于.NET 2.0,请使用MethodInvoker委托. (2认同)

Aar*_*änn 8

调用返回值和非返回值子例程的非常简单的方法。分别使用FuncAction(另请参阅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());
    }  
}
Run Code Online (Sandbox Code Playgroud)

  • 感谢您提供此代码片段,它可能会提供一些有限的即时帮助。[正确的解释将极大地提高其长期价值](//meta.stackexchange.com/q/114762/350567),通过展示*为什么*这是解决问题的一个很好的解决方案,并将使其对未来更有用有其他类似问题的读者。请[编辑]您的答案以添加一些解释,包括您所做的假设。 (2认同)