Что означает "DateTime?" значит в C #? - PullRequest
67 голосов
/ 21 сентября 2008

Я читаю книгу .Net, и в одном из примеров кода есть определение класса с этим полем:

private DateTime? startdate

Что означает DateTime??

Ответы [ 6 ]

129 голосов
/ 21 сентября 2008

Поскольку DateTime является struct, а не class, вы получаете DateTime объект , а не ссылку , когда объявляете поле или переменную такого типа

И, так же, как int не может быть null, так что этот DateTime объект никогда не может быть null, потому что это не ссылка.

Добавление знака вопроса превращает его в обнуляемый тип , что означает, что либо это объект DateTime, или это null.

DateTime? - синтаксический сахар для Nullable<DateTime>, где Nullable само по себе struct.

23 голосов
/ 21 сентября 2008

Это обнуляемый DateTime. ? после того, как примитивный тип / структура указывает, что это версия, допускающая обнуление.

DateTime - это структура, которая никогда не может быть нулевой. От MSDN :

Тип значения DateTime представляет даты и время со значениями в диапазоне от 12:00:00 до полуночи, 1 января, 0001 Anno Domini или AD (также известной как Common Era, или CE) до 23:59:59 PM, декабрь. 31, 9999 г. н.э. (CE)

Однако

DateTime? может быть нулевым.

13 голосов
/ 21 сентября 2008

A ? в качестве суффикса для типа значения допускает нулевые присваивания, которые в противном случае были бы невозможны.

http://msdn.microsoft.com/en-us/library/b3h38hb0.aspx

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

Это означает, что вы можете написать что-то вроде этого:

    DateTime? a = null;
    if (!a.HasValue)
    {
        a = DateTime.Now;
        if (a.HasValue)
        {
            Console.WriteLine(a.Value);
        }
    }

DateTime? синтетически эквивалентно Nullable .

10 голосов
/ 21 сентября 2008

Это эквивалентно Nullable . Вы можете добавить "?" к любому примитивному типу или структуре.

5 голосов
/ 21 сентября 2008

это в основном дает вам дополнительное состояние для примитивов. Это может быть значение или значение NULL. Это может быть полезно в ситуациях, когда значение не нужно назначать. Таким образом, вместо того, чтобы использовать, например, datetime.min или max, вы можете присвоить ему значение null, чтобы не представлять значения.

1 голос
/ 15 мая 2015

Как мы знаем, DateTime является структурой, то есть DateTime является типом значения, поэтому вы получаете объект DateTime, а не ссылку, потому что DateTime не является классом, когда вы объявляете поле или переменную этого типа, вы не можете инициализировать с нулем Потому что типы значений не принимают ноль. Так же, как int не может быть нулевым. поэтому объект DateTime никогда не будет нулевым, потому что это не ссылка.

Но иногда нам нужна переменная или поле значений, допускающие значение NULL, тогда мы используем вопросительный знак, чтобы сделать их типом NULL, чтобы они допускали значение NULL.

Например: -

DateTime? дата = ноль;

INT? intvalue = null;

В приведенном выше коде переменная date является объектом DateTime или имеет значение null. То же самое для intvalue.

...