Если DateTime неизменен, почему работает следующее?
Мне казалось, что я понял, что подразумевал Immutable, однако я не понимаю, почему следующие компиляции и работы:
DateTime dt = DateTime.Now;
Console.WriteLine(dt);
Скопируйте и вставьте следующую часть несколько раз
dt = DateTime.Now;
Console.WriteLine(dt);
Console.ReadLine();
Как и ожидалось, он запускается, и когда я нажимаю клавишу ввода, он отображается в следующий раз... Я думал, что это невозможно, и мне нужно будет создать новый объект. Почему это разрешено/работает? Или, это книга, в которой я работаю неправильно, и DateTime не является неизменным (однако я прочитал это по нескольким источникам)?
Ответы
Ответ 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".)
Нет никакого справочного материала, или что-то еще напуганное.