Что делает “DateTime?” средний в C#?

NullPointerException s - исключения, возникающие при попытке использовать ссылку, которая указывает на отсутствие местоположения в памяти (null), как если бы она ссылалась на объект. Вызов метода по нулевой ссылке или попытка получить доступ к полю нулевой ссылки вызовет функцию NullPointerException. Они наиболее распространены, но другие способы перечислены на странице NullPointerException javadoc.

Вероятно, самый быстрый пример кода, который я мог бы придумать для иллюстрации NullPointerException, be:

public class Example {

    public static void main(String[] args) {
        Object obj = null;
        obj.hashCode();
    }

}

В первой строке внутри main я явно устанавливаю ссылку Object obj равной null. Это означает, что у меня есть ссылка, но она не указывает на какой-либо объект. После этого я пытаюсь обработать ссылку так, как если бы она указывала на объект, вызывая метод на нем. Это приводит к NullPointerException, потому что нет кода для выполнения в местоположении, на которое указывает ссылка.

(Это техничность, но я думаю, что она упоминает: ссылка, которая указывает на null, равна 't то же, что и указатель C, указывающий на недопустимую ячейку памяти. Нулевой указатель буквально не указывает на в любом месте , который отличается от указаний на местоположение, которое оказывается недопустимым.)

70
задан Bart 20 May 2013 в 08:33
поделиться

5 ответов

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

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

Добавление вопросительного знака превращает его в nullable тип , что означает, что или это DateTime объект, , или это null.

DateTime? синтаксический сахар для [1 111], где Nullable самостоятельно struct.

131
ответ дан shareef 24 November 2019 в 13:17
поделиться

Это - nullable DateTime. ? после того, как тип примитива / структура указывает, что это - nullable версия.

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

тип значения DateTime представляет даты и время со значениями в пределах от 12:00:00 полуночи, 1 января, 0001 нашей эры, или нашей эры (также известный как Наша эра или C.E.) в течение 23:59:59, 31 декабря, 9999 нашей эры (C.E).

DateTime? может быть пустым как бы то ни было.

23
ответ дан Pang 24 November 2019 в 13:17
поделиться

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

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? синтетически эквивалентно [1 110] Nullable< DateTime> .

13
ответ дан Jorge Ferreira 24 November 2019 в 13:17
поделиться

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

10
ответ дан Ted Elliott 24 November 2019 в 13:17
поделиться

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

5
ответ дан mattlant 24 November 2019 в 13:17
поделиться
Другие вопросы по тегам:

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