没有返回类型的Func委托


Answers:


759

所有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中定义)的新增功能。


11
仅供参考,基类库的下一个版本将包括Func和Action类型,它们支持四个以上的形式参数。我不记得他们到底有多大。
埃里克·利珀特

88
在.NET 4.0中,它们现在最多可以包含8个参数。如果他们坚持下去,那么在下一个版本中,它将提高到11点!
Michiel van Oosterhout 2010年

9
实际上,看起来它们在4.0中达到16。
Tustin2121

7
1,4,16,64,256,1024,4096,16384,65536,...这清楚地表明,在将来某个时候,编译器将需要能够处理比当前更多的参数。
克里斯·摩根

6
实际上,Tustin2121是正确的,它们Func<,,, ... ,>在.NET 4.0中最多增加了16个参数(如果是,还增加了返回类型),但是每个“系列”的最后八种类型都在中定义System.Core.dll,而不是在中定义mscorlib.dll,因此这就是原因为什么Michielvoo没有看到他们。但是,.NET 4.5和4.5.1中没有添加更多的Funcs或Action。这个序列会变成A170836还是A170875?敬请关注。
Jeppe Stig Nielsen


47

所有的Func委托都带有至少一个参数

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

因此不Func<T>接受任何参数并返回一个值。当您不想返回值时,请使用ActionAction<T>


27

尝试System.Func<T>System.Action


1
我不认为0 arg和.Net 2.0中不存在。
布赖恩

1
很奇怪:.net 2.0中根本不存在Func,尽管Predicate和Action确实存在。
Joel

2
对于.NET 2.0,请使用MethodInvoker委托。
Trevor Elliott 2012年

.NET 2也具有(或具有)Converter<TInput, TOutput>类似于后者的委托类型Func<T, TResult>。它用于将a中的List<>.ConvertAll每个元素投影List<>到另一个对象,然后将所有“函数值”放在new中的方法List<>。(后来,人们经常会使用Linq Select来实现这一点。)
Jeppe Stig Nielsen

0

有时,您将需要编写一个用于事件处理的委托,在这种情况下,除了应该从派生的第二个参数之外,您还可以利用System.EvenHandler<T>其中的一个隐式接受类型object的参数EventArgs。EventHandlers将返回void

我个人发现这在测试过程中对在函数体中创建一次性回调很有用。


0

...不带参数,返回类型为void?

如果您正在为撰写System.Windows.Forms,则还可以使用:

public delegate void MethodInvoker()

0

调用返回值和非返回值子例程的一种非常简单的方法。分别使用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());
    }  
}

1
感谢您提供此代码段,它可能会提供一些有限的即时帮助。通过说明为什么这是解决问题的好方法,适当的解释将大大提高其长期价值,对于其他类似问题的读者也将更有用。请编辑您的答案以添加一些解释,包括您所做的假设。
iBug
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.