Если делегаты неизменны, почему я могу делать такие вещи, как x + = y? - PullRequest
22 голосов
/ 12 августа 2011

Чтение C # In Depth, 2-е издание , раздел 2.1.2 о комбинировании и удалении делегатов.

Название подраздела гласит, что «делегаты неизменны» и что «в них ничего нельзя изменить». В следующем параграфе говорится об использовании таких конструкций, как

x += y;

, где x и y - переменные совместимых типов делегатов.

Разве я не сменил x? Или часть неизменяемости имеет дело с тем, когда утилизируется x, когда я делаю это (т.е. немедленно)?

Ответы [ 2 ]

39 голосов
/ 12 августа 2011

Это как делать:

string x = "x";
string y = "y";

x += y;

Строки тоже неизменны. Приведенный выше код не меняет строку objects - он устанавливает x в другое значение.

Необходимо различать переменные и объекты . Если тип является неизменяемым, это означает, что вы не можете изменять данные в экземпляре этого типа после его создания. Вы можете присвоить переменной этого типа другое значение.

Если вы понимаете, как это работает со строками, то же самое верно и для делегатов. + = Фактически называется Delegate.Combine, так что это:

x += y;

эквивалентно:

x = Delegate.Combine(x, y);

Он ничего не меняет в объекте делегата, на который x ранее ссылался - он просто создает новый объект делегата и присваивает x значение, которое ссылается на этот новый делегат.

5 голосов
/ 12 августа 2011

Вы изменили x, но не изменили его значение (т. Е. Делегата, который он имел).

Это то же самое, что:

int num = 4;
num += 2;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...