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

 Public Shared Function ValidEmailAddress(ByVal emailAddress As String, ByRef errorMessage As String) As Boolean
        If emailAddress.Length = 0 Then
            errorMessage = "E-mail address is required."
            Return False
        End If
        If emailAddress.IndexOf("@") > -1 Then
            If (emailAddress.IndexOf(".", emailAddress.IndexOf("@")) > emailAddress.IndexOf("@")) AndAlso emailAddress.Split(".").Length > 0 AndAlso emailAddress.Split(".")(1) <> "" Then
                errorMessage = ""
                Return True
            End If
        End If
        errorMessage = "E-mail address must be valid e-mail address format."
        Return False
    End Function
21
задан BoltClock 26 January 2012 в 16:59
поделиться

6 ответов

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

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

dt.Day = 3;

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

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


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

45
ответ дан Community 26 January 2012 в 16:59
поделиться

См. это .

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

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

1
ответ дан Jimmy Chandra 26 January 2012 в 16:59
поделиться

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

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

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

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

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

Там нет ссылок или чего-либо еще фанки.

0
ответ дан N73k 26 January 2012 в 16:59
поделиться

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

19
ответ дан BoltClock 26 January 2012 в 16:59
поделиться

Свойство Now выглядит примерно так:

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

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

DateTime.Now является фабрикой для DateTime: -)

5
ответ дан xanatos 26 January 2012 в 16:59
поделиться

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

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

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

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

0
ответ дан supercat 26 January 2012 в 16:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: