ChatGPT解决这个技术问题 Extra ChatGPT

没有返回类型的函数委托

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


m
mantal

所有 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 和 Action 类型。我不记得它们到底有多大。
实际上,看起来它们在 4.0 中上升到 16。
1, 4, 16, 64, 256, 1024, 4096, 16384, 65536, ... 这清楚地表明编译器在将来的某个时候需要能够处理 more arguments to a function than it currently does
实际上,Tustin2121 是对的,它们在 .NET 4.0 中增加了 16 个参数(在 Func<,,, ... ,> 的情况下加上返回类型),但是每个“系列”的最后八种类型是在 System.Core.dll 中定义的,而不是在 { 5},所以这就是 michielvoo 没有看到它们的原因。但是,.NET 版本 4.5 和 4.5.1 中不再添加 Funcs 或 Actions。这个序列会变成 A170836 还是 A170875?敬请关注。
为了方便起见,我提供了一些带有几个参数的重载,但是在某一点上,只需将您的参数包装在一个对象中......
f
famousgarkin

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

我相信 Action 是解决此问题的方法。


J
Joel Coehoorn

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

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

所以 Func<T> 不接受任何参数并返回一个值。如果您不想返回值,请使用 ActionAction<T>


J
JaredPar

试试 System.Func<T>System.Action


不过,我认为 .Net 2.0 中不存在 0 arg 等。
很奇怪:Func 在 .Net 2.0 中根本不存在,尽管 Predicate 和 Action 存在。
对于 .NET 2.0,使用 MethodInvoker 委托。
.NET 2 也有(或有)一个委托类型 Converter<TInput, TOutput>,它类似于后来的 Func<T, TResult>。它在 List<>.ConvertAll 方法中使用,该方法将 List<> 中的每个元素投影到另一个对象上,并将所有“函数值”放在新的 List<> 中。 (后来,人们经常为此使用 Linq Select。)
A
Aarón Ibañez Werthermänn

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

感谢您提供此代码片段,它可能会提供一些有限的即时帮助。 proper explanation would greatly improve its long-term value 通过显示为什么这是解决问题的好方法,并且会使其对有其他类似问题的未来读者更有用。请edit您的回答以添加一些解释,包括您所做的假设。
A
AndyG

有时您会想要为事件处理编写委托,在这种情况下,您可以利用 System.EvenHandler<T>,它隐式接受类型为 object 的参数以及应从 EventArgs 派生的第二个参数。 EventHandlers 将返回 void

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


m
mojmir.novak

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

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

public delegate void MethodInvoker()