代表是不变的,但如何?

Lyr*_*yrk 6 c# delegates

将方法添加到现有委托时会发生什么?我的意思是当我将method1添加到del时,del保存了method1的地址.当我之后添加method2时,del仍指向Method1,方法2地址插入其底部.这是不是意味着我改变了代表?如果我可以改变这一点,为什么在书中告诉"代表是不可改变的"?

MyDel del = method1; 
del += method2; 
del += method3;
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 8

您没有更改Delegate对象 - 您正在更改del以引用其他对象.

它与字符串完全相同.让我们将您的代码转换为相同的东西,但使用字符串:

string str = "x";
str += "y";
str += "z";
Run Code Online (Sandbox Code Playgroud)

您最终会str引用带有内容的字符串对象"xyz".但是你还没有用内容修改字符串对象"x","y"或者"z".

代表们也是如此.

del += method2;
Run Code Online (Sandbox Code Playgroud)

相当于:

del = del + method2;
Run Code Online (Sandbox Code Playgroud)

这相当于:

del = (MyDel) Delegate.Combine(del, method2);
Run Code Online (Sandbox Code Playgroud)

换句话说,"创建一个新的委托对象,该对象具有引用现有两个委托对象的调用列表".(如果其中一个delmethod2为null,则不需要创建新对象.)

有关Delegate.Combine详细信息,请参阅


Dmi*_*nko 5

让我用一个简单的比喻.int是不可变的,所以当你放

int x = 123;
x += 1;
Run Code Online (Sandbox Code Playgroud)

它实际上意味着

int _x = x + 1;
x = _x;
Run Code Online (Sandbox Code Playgroud)

添加一个时,你得到一个新的临时变量_x,然后通过替换它来删除初始变量; 如果是代表x_x

del += method2; 
Run Code Online (Sandbox Code Playgroud)

意思是一样的:

delegate _del = delegate.Combine(del, method2);
del = (MyDel) _del;
Run Code Online (Sandbox Code Playgroud)