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

196

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

DateTime myDate = new DateTime();

или

DateTime myDate = default(DateTime);

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

RJP
источник
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это тип значения) всегда будет вызывать конструктор без параметров.

Servy
источник
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

G.Busato
источник
3
Нет, структуры не обязательно инициализируются до их минимального значения. Они инициализируются, чтобы все биты были равны нулю. Для некоторых типов это их самое низкое значение, для других, таких как числовые типы, которые могут быть отрицательными, это не близко к их минимальному значению. И, конечно, другие все равно не будут сопоставимы и не будут иметь «минимального» значения.
Servy