新しいDateTime()とdefault(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はコンパイル時の定数ではありませんが、default(DateTime)/ new DateTime()はそうです。
リシボブ2014

12
@Ricibobの優れたコメントを明確にするためです。これは重要です。オプションのパラメーターを使用してメソッドを作成する場合は、default(DateTime)またはのいずれかのみを使用できますnew DateTime()。これらは両方ともコンパイル時定数であり、オプションのパラメーター値に必要です。コンパイル時定数が必要とされていない場合は、default(DateTime)new DateTime()、とDateTime.MinValue互換性があります。
2014

回答:


200

いいえ、同じです。

default()、任意の値タイプ(DateTimeは値タイプ)の場合、常にパラメーターなしのコンストラクターを呼び出します。


29
FWIW; C#6では、この動作は変更されます。C#6が導入パラメータなしのコンストラクタの動作ができるように構造体、のためのnewものと異なるためにdefault(T)行います。
vcsjones 2015

30
default(DateTime)プログラマーの意図をよりよく説明しているため、通常はより好ましいと主張できます。
intrepidis 2015

16
@vcsjonesただし、これはC#6.0の最終リリース前に削除されました。
nawfal

5
@nawfalうん。たぶんそれも最高でした。
vcsjones

この答えは間違っていますIMO:2つのものは意味的に同一ですが、どちらもコンストラクターを呼び出しません-両方の構文オプションが使用しますinitobj
マークグラベル

22

メソッドのDateTimeパラメータにデフォルト値を使用する場合は、default(DateTime)のみを使用できます。

次の行はコンパイルされません。

    private void MyMethod(DateTime syncedTime = DateTime.MinValue)

この行はコンパイルされます:

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

3
もちろん、DateTime.MinValueはコンパイルされませんか?オプションのパラメーターはコンパイル時の定数でなければなりませんが、MinValueはそうではありません。ただし、default(DateTime)とnew DateTime()はどちらも有効です(これは面白いです。constDateTime x = default(DateTime)は無効です
。DateTime

16

答えはいいえだ。、両方のケースであることに留意してくださいmdDate.Kind = DateTimeKind.Unspecified

したがって、以下を実行することをお勧めします。

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

myDate.Kindプロパティは読み取り専用なので、コンストラクタが呼び出された後、それを変更することはできません。


2
それはOPの質問にどのように答えますか?
Mo Patel 14年

46
私の回答の最初の4語をご覧ください。
ベンC

4
私はこれに反対するでしょう。デフォルトDateTimeは、との単純な比較により、値ではなく値として使用すると便利ですdefault(DateTime)。デフォルト以外の01/01/0001値とは何ですか?
ローリング、2015年

DateTimeKind.UTCではなく、DateTimeKind.Utcであることを覚えておいてください
Roberto

@Robertoありがとう、修正されました。
jpaugh

-3

それを理解する最も簡単な方法は、DateTimeが構造体であることです。構造体を初期化すると、最小値に初期化されます。DateTime.Min

したがって、差がないdefault(DateTime)new DateTime()DateTime.Min


3
いいえ、構造体がされていない、必ずしもそれらの最小値に初期化。それらはすべてのビットがゼロに初期化されます。いくつかのタイプでは、それはそれらの最小値です。他のタイプ(負になる可能性がある数値タイプなど)では、最小値に近くありません。そしてもちろん、他のものはまだ比較できず、「最小」値を持ちません。
サービー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.