c#委托不能正常工作?

时间:2012-04-05 23:14:51

标签: c# delegates

我对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();
    }
}

2 个答案:

答案 0 :(得分:20)

每次更改委托(+ =或 - =)时,都会有效地创建调用列表的整个副本(将被调用的方法)。

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

答案 1 :(得分: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 的值不会更改DoIt中this 的值。

你做的完全一样。更改test的值不会更改要调用的函数列表;你要求调用一个特定的函数列表,并且将调用该列表。你无法在中途改变它,只需要通过方法调用中途改变this的含义。