为什么输出是5?
问题描述:
我想添加2个更多的功能给我的委托,但它似乎不处理我添加的功能。按照计划产出5.我期待10.为什么会出现这种情况?为什么输出是5?
using System;
namespace abc
{
public delegate int Del(int k);
class Class1
{
public int Add2(int value)
{
return value = value + 2;
}
public int Add3(int value)
{
return value = value + 3;
}
}
class Program
{
static void Main(string[] args)
{
Class1 c = new Class1();
Del mydel = c.Add2;
mydel += c.Add3;
mydel += c.Add2;
Console.WriteLine(mydel(3));
Console.ReadLine();
}
}
}
答
当你调用mydel(3)
情况是这样的:
-
Add2(3)
被调用。这返回3 + 2
= 5,其返回值被丢弃。 -
Add3(3)
被调用。这返回3 + 3
= 6,返回值 被丢弃。 -
Add2(3)
被调用。这返回3 + 2
= 5,其返回值被打印。
当您链接委托时,其中一个的返回值不作为参数传递给链接的参数。
请注意,代表是按LIFO顺序调用的。
如果您想了解如何使用代表实际将功能链接在一起,see this thread。
另外,按照链接的答案(以及由Toskr在下面的评论中提到的),你可以使用GetInvocationList()
和DynamicInvoke()
到链中的方法一起使用,但是这是一件非常不寻常的事情:
static void Main()
{
Class1 c = new Class1();
Del mydel = c.Add2;
mydel += c.Add3;
mydel += c.Add2;
int result = 3;
foreach (var func in mydel.GetInvocationList())
{
result = (int)func.DynamicInvoke(result);
}
Console.WriteLine(result);
}
'mydel(3)'实际上并没有改变参数的值,所以你得到最后一个函数的结果是'Add2(3)'这是3 + 2,所以5 – Rafalon