请帮我理解这个代理示例

时间:2013-12-24 18:53:16

标签: c# .net events delegates

我正在尝试掌握委托的概念,我从SO帖子中抓取了以下代码。 我不理解的是Main方法内部发生了什么。我可以从一个表面看看它有一个新的委托对象和带有匹配参数和返回类型的方法通过引用委托对象来调用。我想知道这三条线具体做了什么:

Valid v1 = new Valid(Test.checkInt);
v1 += new Valid(Test.checkMax);
v1 += new Valid(Test.checkMin);

以下是实际代码:

using System;

public delegate void Valid(int a);

public class Test {
    public const int MAX_VALUE = 255;
    public const int MIN_VALUE = 10;

    public static void checkInt(int a) {
        Console.Write("checkInt result of {0}: ", a);
        if (a < MAX_VALUE && a > MIN_VALUE)
            Console.WriteLine("max and min value is valid");
        else
            Console.WriteLine("max and min value is not valid");
    }

    public static void checkMax(int a) {
        Console.Write("checkMax result of {0}: ", a);
        if (a < MAX_VALUE)
            Console.WriteLine("max value is valid");
        else
            Console.WriteLine("max value is not valid");
    }

    public static void checkMin(int a) {
        Console.Write("checkMin result of {0}: ", a);
        if (a > MIN_VALUE)
            Console.WriteLine("min value is valid");
        else
            Console.WriteLine("min value is not valid");
        Console.WriteLine("");
    }
}

public class Driver {
    public static void Main(string [] args) {
        Valid v1 = new Valid(Test.checkInt);
        v1 += new Valid(Test.checkMax);
        v1 += new Valid(Test.checkMin);
        v1(1);
        v1(10);
        v1(20);
        v1(30);
        v1(254);
        v1(255);
        v1(256);
        Console.ReadLine();
    }
}

4 个答案:

答案 0 :(得分:4)

Valid v1 = new Valid(Test.checkInt);
v1 += new Valid(Test.checkMax);
v1 += new Valid(Test.checkMin);

该代码设置Multi-Cast Delegate。这意味着,当您使用参数(这是Main方法中发生的情况)执行v1时,它会将该参数传递给所有三种检查方法并按顺序执行它们。方法参数在delegate声明中指定。

答案 1 :(得分:1)

Valid v1 = new Valid(Test.checkInt);
v1 += new Valid(Test.checkMax);
v1 += new Valid(Test.checkMin);

第一行声明一个新的委托v1(类似于一个函数指针)。目前,它指向Test.checkInt

然后使用+=运算符,您将委托指向第二种方法,将其提升为MulticastDelegate。同样的事情发生在第三行。

在以下行中,您将调用委托,该委托又调用它指向的所有方法。传递给委托的参数将传递给每个方法。

答案 2 :(得分:1)

有问题的三行使用具有相应返回类型和参数的方法定义符合Valid的签名的委托。 + =运算符从常规委托中生成所谓的多播委托。调用多播委托时,其实现会调用组件委托,从而产生您看到的效果。

答案 3 :(得分:0)

委托的+=运算符是一种组合委托的方法。它将创建一个新的委托,当被调用时,除了这个新方法之外,还将调用委托之前将调用的所有方法。

在这种情况下,执行这些代码行后,调用v1将执行Test.checkIntTest.checkMaxTest.checkMin