需要帮助理解代码的输出

时间:2018-06-02 20:16:10

标签: c# output

所以我通过在线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。

任何人都可以指出我犯了哪个错误,我不明白它是如何运作的?

提前致谢!

2 个答案:

答案 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"而是执行以下操作序列:

  1. 阅读i,当前值为10
  2. 增加i,最多11
  3. 返回在步骤1中读取的值,即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