2012-12-19 4 views
132

これらのいずれかを選択する理由はありますか?新しいDateTime()とデフォルト(DateTime)

DateTime myDate = new DateTime(); 

又は

DateTime myDate = default(DateTime); 

それらの両方が1/1/0001 12:00:00 AM等しいです。

+26

のDateTimeいるMyDate =のDateTime .MinValue'も同様です:/ – Lloyd

+13

@Lloydほとんどの場合...デフォルトのパラメータとしてではありません。DateTime.MinValueはコンパイル時定数ではありませんが、デフォルト(DateTime)/ new DateTime()はデフォルトです。 – Ricibob

+7

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

答えて

139

いいえ、それらは同一です。

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

+22

FWIW; C#6では、この動作が変更されます。 C#6では 'new(default) 'の動作が' default(T) 'の動作と異なることを可能にするstructのために[parameterless constructors](https://roslyn.codeplex.com/discussions/562559)を導入しています。 – vcsjones

+19

'default(DateTime)'はプログラマの意図をよりよく説明しているため、通常はもっと好都合です。 –

+8

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

13

答えはいいえです。どちらの場合も、mdDate.Kind = DateTimeKind.Unspecifiedを念頭に置いてください。

そのためには、次の操作を実行する方が良い場合があります。

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

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

+2

これはOPの質問にどのように答えますか? –

+32

私の答えの最初の4つの言葉を見てください。 –

+2

私はこれに反論したい。デフォルトの 'DateTime'は' default(DateTime) 'と簡単に比較して、値が設定されていない値として便利です。デフォルト以外の '01/01/0001'の値はどのように使用されますか? – Rawling

16

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

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

private void MyMethod(DateTime syncedTime = DateTime.MinValue) 

は、この行は、コンパイルされます:あなたはまた、単に `行うことができますので、DateTime.MinValue``に等しい

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

それは私が探していた答えでした。ありがとう! – GigaKatowice

+0

もちろん、DateTime.MinValueはコンパイルされませんか?オプションのパラメータはコンパイル時定数でなければなりません。MinValueはコンパイル時定数ではありません。 DateTime値はコンパイル時定数として宣言することができないので、const DateTime x = default(DateTime)は無効なので、実際には面白いです) –