所以我通过在线C#编译器运行以下代码,结果是d = 23 x.i = 22。
class X
{
delegate int D(ref int i);
private int i=10;
int m1(ref int i)
{
return i++;
}
int m2(ref int i)
{
return i*=2;
}
int m3(ref int i)
{
return i--;
}
static void Main(string[] args)
{
X x = new X();
D d1 = new D(x.m1), d2 = new D(x.m2), d3 = new D(x.m3);
D d = d1+d2;
d += d1;
d += d3-d1;
System.Console.WriteLine("d=" + d(ref x.i) + " x.i=" + x.i);
}
}
然而,当我自己完成代码时,我从来没有得到过输出。这可能是因为我不理解正确的事情。所以我现在告诉你我是如何尝试解决这个问题的,如果有人能够指出我所犯的错误,我将非常感激。
首先我们有一个x的构造函数,我等于10.然后从我对委托的理解,它就像一个指针/类的引用,d1 = 10,然后x.i = 11因为i ++。然后由于m2方法,d2 = 22,xi = 22,然后d3 = 22,然后是21.然后d = d1 + d2是10 + 22,即32,那么d + = d1是d = 10 + 32,即42最后d + = d3-d1是d = 42 +(22-10)= 52,最后我是21。
任何人都可以指出我犯了哪个错误,我不明白它是如何运作的?
提前致谢!
答案 0 :(得分:3)
将按此顺序调用方法,与i的值交错。
i = 10
m1 -> returns 10, then increases i to 11
i = 11
m2 -> multiplies i up to 22, returns 22
i = 22
m1 -> returns 22, then increases i up to 23
i = 23
m3 -> returns 23, then decreases i down to 22
i = 22
这就是为什么你的输出是d=23, i=22
。
您的委托添加顺序以及生成的委托链如下:
D d = d1 + d2;
// d = d1, d2
d += d1;
// d = d1, d2, d1
d += d3-d1;
// d = d1, d2, d1, d3
请注意,d3
不包含d1
,因此d3-d1
等于d3
,这意味着以下两行在结果中是等效的:
d += d3;
d += d3-d1;
严格地说,m1没有"返回10,然后将i增加到11"而是执行以下操作序列:
i
,当前值为10 i
,最多11 10
答案 1 :(得分:0)
代码按以下顺序运行:
int result;
// d1 + d2
result = x.m1(ref x.i);
// now x.i = 11 and result = 10
result = x.m2(ref x.i);
// now x.i = 22 and result = 22
// d1
result = x.m1(ref x.i);
// now x.i = 23 and result = 22
// d3 - d1 which is d3 because d3 does not contains d1
result = x.m3(ref x.i);
// now x.i = 22 and result = 23