有人能解释一下幕后发生了什么吗?(涉及IT技术)

8

对我来说,这种情况并不是完全明显的。

我期望两个函数都被触发。

要么EventHandler类将要触发的函数列表存储为数组,并且每次添加/删除时都会将数组复制到新数组中,要么在进行赋值操作时,整个内容都被复制到一个新的“集合”中,而不仅仅是引用。

请有人给我讲解一下:D

这是一个小的Linqpad脚本:

public class Moop
{
    public EventHandler myEvent;
}

void Main()
{
    var moo = new Moop();
    moo.myEvent += (o, sender) => { "Added to Moop #1".Dump(); };   

    var moo2 = new Moop();

    //Copy the reference, I assume?
    moo2.myEvent = moo.myEvent;

    moo2.myEvent += (o, sender) => { "Added to Moop #2".Dump(); }; 

    //Fire the event on #1
    moo.myEvent(null, null);
}

瞧瞧运算符重载的威力以及它带来的弊端。 - CodingBarfield
1个回答

8

更准确地说,第二个 Moop 的委托实例被原始值(“添加到 Moop #1”...)和第二个事件处理程序(“添加到 Moop #2”...)的并集所替换。因此,当您执行 += ... 时,您正在替换左侧的值。但是,这个答案的要点是正确的。 - Chris Shain
确实。这就是为什么我在“添加到”之间加上引号的原因。 - Roy Dictus
2
为了让它更清晰(不与你说的任何内容相矛盾),delegate += newDelegate; 大致意思是 delegate = Delegate.Combine(delegate, newDelegate);,从这里可以更清楚地看出一个新的委托被分配给了该字段。 - user743382

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接