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

Если DateTime неизменен, почему работает следующее?

Мне казалось, что я понял, что подразумевал Immutable, однако я не понимаю, почему следующие компиляции и работы:

DateTime dt = DateTime.Now;

Console.WriteLine(dt);

Скопируйте и вставьте следующую часть несколько раз

dt = DateTime.Now;
Console.WriteLine(dt);
Console.ReadLine();

Как и ожидалось, он запускается, и когда я нажимаю клавишу ввода, он отображается в следующий раз... Я думал, что это невозможно, и мне нужно будет создать новый объект. Почему это разрешено/работает? Или, это книга, в которой я работаю неправильно, и DateTime не является неизменным (однако я прочитал это по нескольким источникам)?

4b9b3361

Ответ 1

Сам объект DateTime неизменен, но не ссылка dt. dt разрешено изменять объект DateTime, на который он указывает. Неизменность относится к тому факту, что мы не можем изменять переменные внутри объекта DateTime.

Например, мы не можем пойти

dt.Day = 3;

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

В качестве pst упоминается, readonly и const, вероятно, ближе к тому, что вы думаете, где вы не можете изменить значение переменной.


Боковое примечание: DateTime является Structure и, следовательно, тип значения, и я вводил в заблуждение, вызывая dt a 'reference.' Тем не менее, я считаю, что все еще верно, что dt по-прежнему остается переменной, указывающей на неизменяемый объект, и сама переменная все еще изменена. Благодаря dan04 для указания этого.

Ответ 2

Вы просто говорите переменной dt, чтобы ссылаться на другой экземпляр DateTime. Под капотом свойство DateTime.Now генерирует новый экземпляр DateTime при каждом обращении к нему.

Ответ 3

Свойство Now - это что-то вроде:

 DateTime Now {
     get {
         // Get the OS time
         return new DateTime(year, month, day, hour, min, sec...)
     }
 }

(технически false, теперь вызывает внутренне UtcNow, вызывающий ОС:-), но вы получаете идею).

DateTime.Now является factory для DateTime: -)

Ответ 4

См. this.

Посмотрите все эти методы Описание... он всегда говорит "Возвращает новую дату Date...". Он не меняет текущий объект DateTime, поэтому он неизменен.

Переменная ссылка - это другое дело. Подумайте об этом как о указателе на фактический неизменяемый объект DateTime, который можно изменить, чтобы указать другой.

Ответ 5

Если экземпляр нетривиального типа структуры хранится в доступном для записи месте хранения (не readonly, локальной переменной, слоте массива и т.д.), все его поля будут изменчивыми. Если экземпляр хранится в недоступном для хранения месте хранения (поле readonly, временное значение, созданное компилятором и т.д.), То ни одно из его полей не будет изменяться. Понятие "неизменяемого типа структуры" является неправильным, поскольку утверждение:

myStruct1 = myStruct2; // Assume variables are of the same structure type

будет, если myStruct1 доступен для записи, замените все публичные и частные поля myStruct1 соответствующими полями myStruct2; если myStruct1 не доступен для записи, оператор генерирует ошибку времени компиляции. Код структуры не имеет права говорить в этом вопросе и даже не будет уведомлен о том, что присвоение выполнено.

Хотя DateTime не предоставляет никаких средств, с помощью которых существующий экземпляр DateTime может быть изменен, кроме как при назначении всей структуры, он ничего не может сделать, чтобы предотвратить переписывание полей одного экземпляра с содержимым другого, как это происходит с dateTimeVariable = DateTime.Now;.

Ответ 6

Ответ прост. DateTime не является неизменным. Это структура. И я не знаю, как можно создать неизменяемую структуру.

Если вы это сделаете:

DateTime d1 = DateTime.Now;
DateTime d2 = DateTime.Now;
d1 = d2;

Затем структура d1 будет перезаписана значениями d2.

(A DateTime действительно имеет только одно значение. Если вы запустите декомпилятор, это частное поле, которое называется "ticks".)

Нет никакого справочного материала, или что-то еще напуганное.