Подтвердить что ты не робот

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

Чтение С# в глубине, второе издание, раздел 2.1.2 по объединению и удалению делегатов.

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

x += y;

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

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

4b9b3361

Ответ 1

Что нравится делать:

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

x += y;

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

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

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

x += y;

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

x = Delegate.Combine(x, y);

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

Ответ 2

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

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

int num = 4;
num += 2;