为什么在我们将ref对象分配给另一个ref对象的情况下,以下代码的行为与其他引用类型不同,两个对象都指向内存中的相同位置?它看起来像是发给我的价值副本。
delegate
声明:
class Car {
public delegate void CarEngineHandler(string text);
/* ... */
}
Car.CarEngineHandler carHandler1 = PrintText1;
carHandler1 += PrintText2;
Car.CarEngineHandler carHandler2 = carHandler1;
carHandler2 -= PrintText2;
carHandler1("Hello");
输出:
从PrintText1打印:您好 从PrintText2打印:Hello
答案 0 :(得分:4)
代理是不可变的,所以当你运行例如这一行(调用Delegate.Remove
):
carHandler2 -= PrintText2;
您创建新委托,并将其存储在carHandler2
中,而不是更改现有委托。
为了说明这一点,请看下面的代码,它使用字符串(字符串也是引用类型和不可变的):
String string1 = "Foo";
string1 += "Bar";
String string2 = string1;
string2 += "EvenMorebar";
string2
现在为FooBarEvenMorebar
,但string1
仍为FooBar
。