Nullable<>.HasValue
セマンティクスが好きだったので、いつも使用していました。ただし、最近、私は他の誰かがNullable<> != null
代わりに独占的に使用していた既存のコードベースに取り組んでいました。
どちらか一方を使用する理由はありますか、それとも純粋に好みですか?
int? a; if (a.HasValue) // ...
対。
int? b; if (b != null) // ...
(a != null)
構文が参照型と一致することを好みます。
VB.Net で。".HasValue" を使用できる場合は、"IsNot Nothing" を使用しないでください。「IsNot Nothing」を「.HasValue」に置き換えることで、「操作によりランタイムが不安定になる可能性があります」という中程度の信頼エラーを解決しました。理由はよくわかりませんが、コンパイラで何か違うことが起こっています。C# の "!= null" にも同じ問題があると思います。
linq を使用していて、コードを短くしたい場合は、常に使用することをお勧めします!=null
そして、これが理由です:
null 可能な double変数を持つクラスFoo
があるとします。SomeDouble
public class Foo
{
public double? SomeDouble;
//some other properties
}
コードのどこかで、Foo のコレクションから null 以外の SomeDouble 値を持つすべての Foo を取得したい場合 (コレクション内の一部の foo も null になる可能性があると仮定)、少なくとも 3 つの方法で関数を記述します ( C# を使用します 6) :
public IEnumerable<Foo> GetNonNullFoosWithSomeDoubleValues(IEnumerable<Foo> foos)
{
return foos.Where(foo => foo?.SomeDouble != null);
return foos.Where(foo=>foo?.SomeDouble.HasValue); // compile time error
return foos.Where(foo=>foo?.SomeDouble.HasValue == true);
return foos.Where(foo=>foo != null && foo.SomeDouble.HasValue); //if we don't use C#6
}
そして、この種の状況では、常に短い方を選ぶことをお勧めします