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
Сам объект DateTime
является неизменным, но не является эталонным dt . ДТ разрешено изменять, на какой объект DateTime
он указывает. Неизменяемость относится к тому факту, что мы не можем изменять переменные внутри объекта DateTime
.
Например, мы не можем перейти
dt.Day = 3;
dt сама по себе является просто ссылочной переменной, которая указывает на объект DateTime
. По определению допускается варьировать .
Как упоминалось в pst , только для чтения и const , вероятно, ближе к тому, что вы думаете, где вы не можете изменить значение переменная.
Примечание: DateTime является структурой , и, следовательно, имеет тип значения , и меня вводят в заблуждение, вызывая dt
ссылка.' Тем не менее, я думаю, что все еще верно, что dt
по-прежнему является просто переменной, «указывающей» на неизменяемый объект, а сама переменная все еще является изменчивой. Спасибо dan04 за указание на это.
См. это .
См. Все эти методы Description ... всегда написано "Возвращает новый DateTime ...". Он не меняет текущий объект DateTime, поэтому он неизменен.
Ссылка на переменную - это совсем другое. Думайте об этом просто как указатель на фактический неизменяемый объект DateTime, который можно изменить, чтобы он указывал на другой объект.
Ответ прост. DateTime не является неизменным. Это структура. И я не знаю, как можно иметь неизменную структуру.
Если вы сделаете это:
DateTime d1 = DateTime.Now;
DateTime d2 = DateTime.Now;
d1 = d2;
Тогда структура d1 будет перезаписана значениями d2.
(DateTime действительно имеет только одно значение. Если вы запускаете декомпилятор, это частное поле с именем «ticks», я считаю.)
Там нет ссылок или чего-либо еще фанки.
Вы просто указываете переменную dt
, чтобы ссылаться на другой экземпляр DateTime
. Под капотом свойство DateTime.Now
генерирует новый экземпляр DateTime
каждый раз, когда вы к нему обращаетесь.
Свойство Now выглядит примерно так:
DateTime Now {
get {
// Get the OS time
return new DateTime(year, month, day, hour, min, sec...)
}
}
(технически неверно, Now теперь внутренне вызывает UtcNow, который вызывает ОС :-), но вы поняли идею).
DateTime.Now является фабрикой для DateTime: -)
Если экземпляр нетривиального типа структуры хранится в доступном для записи месте хранения (не readonly
поле, локальная переменная, слот массива и т. Д.), Все его поля будут изменяемыми. Если экземпляр хранится в недоступном для записи месте хранения (поле readonly
, временное значение, сгенерированное компилятором и т. Д.), То ни одно из его полей не будет изменяемым. Понятие «тип неизменяемой структуры» является неправильным, поскольку утверждение:
myStruct1 = myStruct2; // Assume variables are of the same structure type
, если myStruct1
доступно для записи, заменит все открытые и закрытые поля из myStruct1
соответствующими полями myStruct2
; если myStruct1
не доступно для записи, оператор сгенерирует ошибку во время компиляции. Код для структуры не имеет права голоса в этом вопросе, и даже не будет уведомлен о том, что присвоение выполнено .
Хотя DateTime
не предоставляет никаких средств, с помощью которых можно изменить существующий экземпляр DateTime
, кроме как посредством целочисленного присваивания , он ничего не может сделать для того, чтобы код не мог перезаписать поля одного экземпляра с помощью содержимое другого, как это происходит с dateTimeVariable = DateTime.Now;
.