10

我对 c# 有点陌生,所以我想出了这个问题。问题:为什么调用func2?哦,还有一件事。假设我向委托添加了一个函数。在这个函数中,我调用了另一个委托,但是我想确保在这个函数调用这个委托之前调用添加到第一个委托的所有其他函数,是否有任何干净的解决方案(对 getInvocationList 并不真正感兴趣)。谢谢各位,你们是最棒的。

class Program
{
    delegate void voidEvent();
    voidEvent test;

    private void func1()
    {
        Console.Write("func1");
        test -= func2;
    }

    private void func2()
    {
        Console.WriteLine("func2");
    }

    static void Main(string[] args)
    {
        Program p = new Program();
        p.test += p.func1;
        p.test += p.func2;
        p.test();
    }
}
4

2 回答 2

20

每次更改委托(+= 或 -=)时,您实际上是在创建调用列表的完整副本(将被调用的方法)。

因此,当您调用 时p.test();,您将在该时间点调用调用列表中的每个委托。在其中一个处理程序中更改 this 将为下一次调用更改它,但不会更改当前正在执行的调用。

于 2012-04-05T23:18:52.567 回答
7

里德当然是正确的。这是另一种思考方式。

class Number
{
    public static Number test;
    private int x;
    public Number(int x) { this.x = x; }
    public Number AddOne() 
    {
        return new Number(x + 1);
    }
    public void DoIt()
    {
        Console.WriteLine(x);
        test = test.AddOne();
        Console.WriteLine(x);
    }
    public static void Main()
    {
        test = new Number(1);
        test.DoIt(); 
    }
}

应该打印 1、1 还是 1、2?为什么?

它应该打印 1, 1。当你说

test.DoIt();

这并不意味着

        Console.WriteLine(test.x);
        test = test.AddOne();
        Console.WriteLine(test.x);

!相反,这意味着

Number temporary = test;
Console.WriteLine(temporary.x);
test = test.AddOne();
Console.WriteLine(temporary.x);

更改 的值test 不会更改thisDoIt 中的值。

你正在做同样的事情。更改 的值test不会更改您正在调用的函数列表;您要求调用特定的函数列表,并且该列表将被调用。你不能在中途改变它,就像你不能在this方法调用中途改变它的含义一样。

于 2012-04-06T06:37:03.583 回答