новый DateTime () против по умолчанию (DateTime)


196

Есть ли причина выбрать один из них над другим?

DateTime myDate = new DateTime();

или

DateTime myDate = default(DateTime);

Они оба равны 1/1/0001 12:00:00 AM.


28
Что равно DateTime.MinValue, так что вы могли бы просто DateTime myDate = DateTime.MinValueтак же: /
Ллойд

20
@Lloyd Большую часть времени ... но не как параметр по умолчанию DateTime.MinValue не является постоянной времени компиляции - но по умолчанию (DateTime) / new DateTime () это.
Ричибоб

12
Просто чтобы прояснить отличный комментарий @ Ricibob, потому что это важно: если вы создаете метод с необязательным параметром, вы можете использовать ТОЛЬКО либо, default(DateTime)либо new DateTime(). Это обе константы времени компиляции , необходимые для необязательных значений параметров. Если компиляции константы времени не требуется, то default(DateTime), new DateTime()и DateTime.MinValueявляются взаимозаменяемыми.
Линн

Ответы:


200

Нет, они идентичны.

default(), для любого типа значения ( DateTimeэто тип значения) всегда будет вызывать конструктор без параметров.


29
FWIW; В C # 6 это поведение изменится. C # 6 вводит конструкторы без параметров для структур, которые позволяют поведению newотличаться от того, что default(T)будет делать.
vcsjones

30
Можно утверждать, что default(DateTime)это более наглядно описывает намерения программиста, поэтому обычно более благоприятно.
Intrepidis

16
@vcsjones это было удалено до финальной версии C # 6.0.
Nawfal

5
@nawfal Да. Наверное, лучше, чем когда-либо.
vcsjones

Этот ответ просто неправильный IMO: эти две вещи семантически идентичны, но ни одна из них не вызывает конструктор - обе опции синтаксиса используютinitobj
Марк Гравелл

22

Если вы хотите использовать значение по умолчанию для параметра DateTime в методе, вы можете использовать только default (DateTime).

Следующая строка не скомпилируется:

    private void MyMethod(DateTime syncedTime = DateTime.MinValue)

Эта строка скомпилирует:

    private void MyMethod(DateTime syncedTime = default(DateTime))

3
Конечно DateTime.MinValue не компилируется? Необязательные параметры должны быть константами времени компиляции, а MinValue - нет. хотя по умолчанию (DateTime) и новый DateTime () действительны (что на самом деле забавно, потому что const DateTime x = default (DateTime) недопустим, поскольку значения DateTime не могут быть объявлены как константы времени компиляции)
Джерри Кангасниеми,

16

Ответ - нет. Имейте в виду, что в обоих случаях mdDate.Kind = DateTimeKind.Unspecified.

Поэтому может быть лучше сделать следующее:

DateTime myDate = new DateTime(1, 1, 1, 0, 0, 0, DateTimeKind.Utc);

myDate.KindСвойство только для чтения, поэтому он не может быть изменен после того , как конструктор вызывается.


2
как это отвечает на вопрос ОП?
Мо Патель

46
Пожалуйста, посмотрите первые 4 слова моего ответа.
Бен С

4
Я бы поспорил против этого. Значение по умолчанию DateTimeполезно в качестве значения, не установленного, с простым сравнением с default(DateTime). Какой 01/01/0001смысл использовать значение не по умолчанию ?
Роулинг

Имейте в виду, что это DateTimeKind.Utc вместо DateTimeKind.UTC
Роберто

@ Роберто Спасибо, исправлено.
jpaugh

-3

Самый простой способ понять это - DateTime - это структура. Когда вы инициализируете структуру, она инициализируется до минимального значения:DateTime.Min

Поэтому нет никакой разницы между default(DateTime)и new DateTime()иDateTime.Min


3
Нет, структуры не обязательно инициализируются до их минимального значения. Они инициализируются, чтобы все биты были равны нулю. Для некоторых типов это их самое низкое значение, для других, таких как числовые типы, которые могут быть отрицательными, это не близко к их минимальному значению. И, конечно, другие все равно не будут сопоставимы и не будут иметь «минимального» значения.
Servy
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.