Здесь описано здесь . Основная реализация - в Objects/stringobject.c
. Однако подклассы str
, вероятно, не то, что вы хотите. Я бы предпочел здесь композицию; имеют объект со строковым полем и особым поведением.
? означает, что тип допускает значение NULL. Подробнее см., Например, MSDN
Nullable - это поддерживаемая компилятором оболочка вокруг типов значений, которая позволяет типам значений становиться пустыми.
Чтобы получить доступ к значению DateTime, вам необходимо сделать следующее:
DateTime? dateOrNull = myCalendarExtender.SelectedDate;
if (dateOrNull != null)
{
DateTime newSelectedDate = dateOrNull.Value;
}
DateTime?
- это то же самое, что и Nullable<DateTime>
. То есть: экземпляр DateTime?
может содержать «NULL», а экземпляр DateTime
- нет. (Это верно для всех типов значений, начиная с .NET 2.0. Тип значения не может содержать NULL, но, начиная с .NET 2.0, типы значений, допускающие значение NULL, поддерживаются с помощью конструкции Nullable<T>
(или сокращения?).
Вы можете получить значение DateTime? И поместить его в DateTime, выполнив следующее:
DateTime? someNullableDate;
DateTime myDate;
if( someNullableDate.HasValue )
myDate = someNullableDate.Value;
Другой, более краткий способ получить значение Nullable, это использование оператора слияния нуль:
DateTime myDate = someNullableDate?? default(DateTime);
Элемент управления Calendar возвращает значение Nullable < DateTime > (сокращенно в C # это DateTime?) в свойстве SelectedDate, поскольку DateTime является структурой. Нулевое значение позволяет элементу управления иметь состояние «дата не выбрана». Таким образом, вам нужно проверить, имеет ли значение nullable значение, прежде чем вы сможете его использовать.
var nullable = myCalendarExtender.SelectedDate; var newSelectedDate = (nullable.HasValue) ? nullable.Value : SomeDefaultValue;
РЕДАКТИРОВАТЬ: еще более кратким, благодаря комментарию Джоша:
var newSelectedDate = myCalendarExtender.SelectedDate ?? SomeDefaultValue;
Мне нравится!
Вы можете использовать ?? для очень краткой работы с значениями NULL в C #. См. Мой комментарий к ответу Трэвиса для более короткого способа выражения концепции «если не null, то используйте его, иначе используйте какое-то значение по умолчанию». Они оба делают одно и то же.
Намного лучшее решение и лучшая функция IMO с классом, допускающим значение NULL
DateTime newSelectedDate = myCalendarExtender.SelectedDate.GetValueOrDefault();