我有以下代码:
Func<string, string> func1 = (param) =>
{
Console.WriteLine("Func 1 executing");
return "Hello" + param;
};
Func<string, string> func2 = (param) =>
{
Console.WriteLine("Func 2 executing");
return "World" + param;
};
Func<string, string> funcSum = func1 + func2;
string funcResult = funcSum("!");
Console.WriteLine(funcResult);
输出是:
Func 1 executing
Func 2 executing
World!
求和的倒数:
Func<string, string> funcSum = func2 + func1;
给出输出:
Func 2 executing
Func 1 executing
Hello!
我的初始测试是使用布尔返回类型完成的,返回值也始终由最后一个函数确定。它是否按预期工作?我们不会丢失其他函数的返回值吗?如果是这样,在现实世界中是否存在这些多播委托功能的用例?
它是否按预期工作?
至少它按规定工作。无论这是否是您想要的,都是另一回事:) 来自 C# 5 规范的第 15.4 节 - 重点是我的:
其调用列表包含多个条目的委托实例的调用通过同步、按顺序调用调用列表中的每个方法来进行。每个如此调用的方法都会传递与委托实例相同的一组参数。如果此类委托调用包含引用参数(第 10.6.1.2 节),则每个方法调用都将引用同一变量;调用列表中的一种方法对该变量的更改对于调用列表中更靠下的方法是可见的。如果委托调用包含输出参数或返回值,则它们的最终值将来自列表中最后一个委托的调用。
Next:
我们不会丢失其他函数的返回值吗?
是的,目前。
如果是这样,在现实世界中是否存在这些多播委托功能的用例?
老实说,很少见。但是,您可以使用以下方法将多播委托分开:Delegate.GetInvocationList() https://learn.microsoft.com/en-us/dotnet/api/system.delegate.getinvocationlist:
foreach (Func<string, string> func in funcSum.GetInvocationList())
{
Console.WriteLine(func("!"));
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)