以下よりもNULL可能日時を比較するより良い方法を探しています。
助言がありますか?
// myobject.ExpireDatetime is of DateTime?
//
if (!myobject.ExpireDateTime.IsNull() && DateTime.Compare((DateTime)myobject.ExpireDateTime, DateTime.Now.ToUniversalTime()) < 0)
{ //error! }
編集:混乱して申し訳ありません... myobject.ExpireDatetimeはDateTime型です。
あなたの質問は私には明確ではありませんが、私たちが持っている場合
DateTime? ExpireDateTime; // could be a variable or a property
ただ言ってもいい
if (ExpireDateTime < DateTime.UtcNow)
{
...
}
ExpireDateTime
がnull
(HasValue
がfalse)の場合、これは問題ありません。経験の浅い開発者の中には 持ち上げられた演算子 を理解するのに苦労する人もいるでしょう。
if (ExpireDateTime < (DateTime?)DateTime.UtcNow)
{
...
}
同じですが、読みやすく、理解しやすいです。
Neverwrite .Value
もちろん、null許容値がnullである可能性がある場合。 InvalidOperationException
"Nullable object must have a value"を取得します。
以下を使用することをお勧めします。
int y = Nullable.Compare<DateTime>(DateTime.UtcNow, x);
// x is the nullable date time object.
// y will be '-1' if x is greater than DateTime.UtcNow
コンパイラー lifts 変数とnullをチェックするコードを生成します。
> new DateTime?()
null
> DateTime.Now > null
false
> DateTime.Now < null
false
> new int?()
null
> 10 >= null
false
> 10 =< null
false
> 10 == null
false
> 10 != null
true
これを知っていれば、簡単なコードを書くことができます。
// d is a DateTime?
DateTime now = DateTime.Now;
bool after = d > now;
bool before = d < now;
bool today = d?.Date == now.Date;
Dがnullの場合、すべてがfalseになります。それ以外の場合、通常のDateTime比較のように機能します。
Nullableの Value
プロパティを使用します。
objet.ExpireDateTime.Value
if (!object.ExpireDateTime.IsNull()
&& DateTime.Compare(objet.ExpireDateTime.Value,
DateTime.Now.ToUniversalTime()) < 0)
{
}
ExpireDateTime
がNullable<DateTime>
iの場合、代わりに以下を実行します。
if (ExpireDateTime.HasValue && ExpireDateTime < DateTime.Now.ToUniversalTime())
{
}