483

Nullable<>.HasValueセマンティクスが好きだったので、いつも使用していました。ただし、最近、私は他の誰かがNullable<> != null代わりに独占的に使用していた既存のコードベースに取り組んでいました。

どちらか一方を使用する理由はありますか、それとも純粋に好みですか?

  1. int? a;
    if (a.HasValue)
        // ...
    

対。

  1. int? b;
    if (b != null)
        // ...
    
4

6 に答える 6

55

(a != null)構文が参照型と一致することを好みます。

于 2009-08-14T04:42:42.743 に答える
13

VB.Net で。".HasValue" を使用できる場合は、"IsNot Nothing" を使用しないでください。「IsNot Nothing」を「.HasValue」に置き換えることで、「操作によりランタイムが不安定になる可能性があります」という中程度の信頼エラーを解決しました。理由はよくわかりませんが、コンパイラで何か違うことが起こっています。C# の "!= null" にも同じ問題があると思います。

于 2010-04-23T18:13:55.857 に答える
0

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
}

そして、この種の状況では、常に短い方を選ぶことをお勧めします

于 2017-08-28T14:38:27.220 に答える