回答:
C#で値が割り当てられていない変数を使用する唯一の方法は、その変数をローカル変数にすることです。この場合、コンパイル時に、変数を読み取ろうとしても、その変数が確実に割り当てられていないことがわかります。 )
私はあなたが本当にNullable<DateTime>
(またはDateTime?
C#構文糖を使って)望んでいるのではないかと思います-それnull
を最初にして通常のDateTime
値を割り当てます(適切に変換されます)。次に、と比較null
(またはHasValue
プロパティを使用)して、「実際の」値が設定されているかどうかを確認できます。
default(DateTime)
、最初からそうであったフィールドの違いはわかりません。基本的には、ドメイン内の1つの値を「特別で通常の使用には使用できない」として扱います。
そういう意味ですか:
DateTime datetime = new DateTime();
if (datetime == DateTime.MinValue)
{
//unassigned
}
またはNullableを使用できます
DateTime? datetime = null;
if (!datetime.HasValue)
{
//unassigned
}
これをどこかに置きます:
public static class DateTimeUtil //or whatever name
{
public static bool IsEmpty(this DateTime dateTime)
{
return dateTime == default(DateTime);
}
}
次に:
DateTime datetime = ...;
if (datetime.IsEmpty())
{
//unassigned
}
IsEmpty
メソッドはtrueを返しますが、これはおそらく望んでいるものではありません(空ではないため、デフォルト値が割り当てられています)。あなたのメソッドの名前はとしてより適してIsDefaultValue
いると思います。nullを許容しないDateTimeを実際に持つことはできないためですIsEmpty
。
IsDefaultValue
よかっただろう
割り当てられていない日時のGetHashCode()が常にゼロであることを知りました。これがnullの日時をチェックするための良い方法であるかどうかはわかりません。これは、この動作が表示される理由に関するドキュメントが見つからないためです。
if(dt.GetHashCode()==0)
{
Console.WriteLine("DateTime is unassigned");
}
GetHashCode
ティック(DateTimeの内部表現)も0に等しいため、0を返します。ハッシュコードは次の方法で計算されます unchecked((int)ticks) ^ (int)(ticks >> 32);
。こちらもご覧ください:referencesource.microsoft.com/#mscorlib/system/datetime.cs,836