1

这两个类有什么区别?哪个更可取?

class MulticastExample
{
    delegate void ME();

    ME me;

    public MulticastExample()
    {
        ME a = new ME(() => Console.WriteLine("A"));
        ME b = new ME(() => Console.WriteLine("B"));

        me = a + b;
    }

    public void Run()
    {
        me();
    }
}

-

class ListExample
{
    delegate void LE();

    List<LE> le = new List<LE>();

    public ListExample()
    {
        LE a = new LE(() => Console.WriteLine("A"));
        LE b = new LE(() => Console.WriteLine("B"));

        le.Add(a);
        le.Add(b);
    }

    public void Run()
    {
        foreach (var x in le)
        {
            x();
        }
    }
}
4

2 回答 2

1

我认为您应该使用第一个示例。请注意,您始终可以通过说出“多播”委托来获取项目列表me.GetInvocationList()。该类型MulticastExample.ME从 继承此方法System.Delegate

当您分配给a并且b您不必使用new语法时。相同的委托由以下人员创建:

ME a = () => Console.WriteLine("A");

请注意,每个实例ME都是不可变的,并且具有固定长度的调用列表。此列表保证至少包含一项。

当您“添加”或“减去”(组合或删除)委托时,原始实例保持不变(不变性)并创建一个新实例。

如果“减法”的结果如下:

ME c = b - a;

将给出一个长度为零的多播委托,不会创建新实例,null而是返回一个引用(即c变为null)。因此,请记住null在调用之前进行检查:c();

如果您选择List<T>改用,一个区别是(您现在可能已经知道)aList<>是可变的。另请注意,您有责任检查没有任何成员List<>本身是多播的,因为.NET 中的任何委托类型都允许多个项目的调用列表。

最后(但我猜你知道)委托类型ME不需要嵌套在其他类型中(在本例中为class MulticastExample),但是当您希望委托类型成为包含类。

如果您打算使您的委托类型成为泛型类型,如果您打算与+.

于 2012-11-25T08:04:28.467 回答
1

使用MulticastExample, 一次调用me将调用它的所有方法subscribed。因此ab将通过一次调用调用me

ListExample您必须单独调用每个代表。因此,您必须单独调用以及在a循环中执行的操作bforeach


如果a并且b将要引用相同签名的单个方法,那么ListExample是多余的。您应该使用MulticastExample.

于 2012-11-25T08:04:37.420 回答