具体的には、DateTimeがありますか?生年月日
私の質問は、この場合に何が起こるかです:
lblBirthDate.Text = myObject.BirthDate.GetValueOrDefault().ToString();
BirthDateがnullになる場合。resharperをインストールしましたが、nullの問題が発生する可能性があることを警告していません...
具体的には、DateTimeがありますか?生年月日
私の質問は、この場合に何が起こるかです:
lblBirthDate.Text = myObject.BirthDate.GetValueOrDefault().ToString();
BirthDateがnullになる場合。resharperをインストールしましたが、nullの問題が発生する可能性があることを警告していません...
BirthDate
の場合null
、のデフォルトインスタンスのローカライズされた文字列表現を取得しますDateTime
。つまり、0001年1月1日の00:00:00.0000000の文字列表現を取得します。
ヌルの問題がないため、ReSharperから警告は表示されません。Nullable<T>.GetValueOrDefault
のnullインスタンスを呼び出すことは実行時の例外ではありませんNullable<T>
。代わりに、nullインスタンスがある場合は、デフォルト値を取得します。それがまさにGetValueOrDefault
意味することです。ifを取得し、そうでないValue
場合HasValue
はtrue
、基になる構造体タイプのデフォルト値を取得します。
nullの場合は必ずGetValueOrDefault
返されます。DateTime.MinValue
null値を処理する方法は次のとおりです。
DateTime? myNullDate = null;
DateTime myDate;
myDate = myNullDate ?? DateTime.Now; // myDate => DateTime.Now
myDate = myNullDate ?? default(DateTime); // myDate => DateTime.MinValue
myDate = myNullDate.GetValueOrDefault(DateTime.Now); // myDate => DateTime.Now
myDate = myNullDate.GetValueOrDefault(); // myDate => DateTime.MinValue
DateTimeのデフォルト値は1/1/100:00:00であるため、Resharperはエラーを表示しません。デフォルト演算子を使用して、任意のタイプのデフォルト値を取得できます。
DateTime defaultDateTime = default(DateTime);
この値はとまったく同じですDateTime.MinValue
nullを使用する必要がある場合は、プロパティをnull可能として宣言する必要があります。
DateTime? BirthDay { get; set; };
null許容のDateTimeは、値がnullの場合でもエラーなしのDateTime?
呼び出しをサポートし、nullの場合は空の文字列を提供します。ToString()
そうすれば、nullについて心配する必要はありません。
default(DateTime)
のような欠落値を表す特別な値を持つよりも、null許容のDateTimeを使用する方がはるかに一貫性があります。DateTime.MinValue;