новий 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 () є.
Ricibob

12
Просто для уточнення відмінного коментаря @ Ricibob, тому що це важливо: якщо ви створюєте метод з необов'язковим параметром, ви можете ТОЛЬКО використовувати або default(DateTime)або new DateTime(). Це обидва константи часу компіляції , необхідні для необов'язкових значень параметрів. Якщо компіляції константи часу не потрібно, то default(DateTime), new DateTime()і DateTime.MinValueє взаємозамінними.
leanne

Відповіді:


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

Ця відповідь є просто помилковою ІМО: дві речі семантично однакові, але жодна з них не називає конструктор - обидва варіанти синтаксису використовуютьinitobj
Марк Гравелл

22

Якщо ви хочете використовувати значення методу за замовчуванням для параметра DateTime у методі, ви можете використовувати лише типове (DateTime).

Наступний рядок не збирається:

    private void MyMethod(DateTime syncedTime = DateTime.MinValue)

Цей рядок буде компілювати:

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

3
Звичайно DateTime.MinValue не компілюється? Необов’язкові параметри повинні бути константами часу компіляції, яких MinValue не є. за замовчуванням (DateTime) і new DateTime () є дійсними, хоча (це насправді смішно, тому що const DateTime x = за замовчуванням (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
Роберто

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

-3

Найпростіший спосіб зрозуміти це, що DateTime - це структура. Коли ви ініціалізуєте структуру, вона ініціалізується до мінімального значення:DateTime.Min

Тому різниці між default(DateTime)і new DateTime()та немаєDateTime.Min


3
Ні, структури не обов'язково ініціалізуються до мінімального значення. Вони ініціалізовані, щоб усі біти дорівнювали нулю. Для деяких типів це їх найменше значення, для інших, таких як числові типи, які можуть бути негативними, це зовсім не близько їх мінімального значення. І звичайно, інші все одно не будуть порівнянні та не матимуть "мінімального" значення.
Сервіс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.