default(Foo)、Foo.Empty、またはnullを使用する必要がありますか?

StackOverflow https://stackoverflow.com/questions/188864

  •  06-07-2019
  •  | 
  •  

質問

C#では、default(Foo)を使用して、認識された<!> quot;まだ記入されていない<!> quot; /空のクラスのインスタンスを取得できるようになりました-まったく同じかどうかわかりませんnew Foo()としてかどうか。多くのライブラリクラスは、同様のインスタンスを返すFoo.Emptyプロパティも実装します。そしてもちろん、どの参照タイプもnullを指すことができます。本当に違いは何ですか?正しいか間違っているのはいつですか?一貫性のあるもの、またはパフォーマンスが向上しているものは何ですか?オブジェクトが概念的に<!> quot;プライムタイムの準備ができていない<!> quot;かどうかを確認するとき、どのテストを使用する必要がありますか?すべての人がFoo.IsNullOrEmpty()を持っているわけではありません。

役に立ちましたか?

解決

default(Foo)は、Fooがクラス型の場合はnull、default()が値型(intなど)の場合はゼロ、すべてのフィールドが their <に初期化されたSomeClass<T>のインスタンスを返します/ em>それぞれのMyMethod<T>値。ここでString.Emptyは構造体です。ジェネリックが値型と参照型の両方をサポートできるように言語に追加されました-詳細 MSDNの情報

""または<=>のコンテキストでTをテストするときに、Tが値型、クラス型、または構造体のいずれであるかわからない場合は、<=>を使用します。

それ以外の場合、nullは<!> quot; unknown <!> quot;を意味し、空は<!> quot;を意味する必要があります。クラスの空の(ただしnullでない)インスタンスが本当に必要な場合は、Foo.Emptyパターンを使用します。例えば何らかの変数を空の文字列に初期化する必要がある場合は、<=>の代替として<=>を使用します。

参照型(クラス)を操作していることがわかっており、ジェネリックが含まれておらず、初期化されていない参照を明示的にテストしている場合は、nullを使用します。

他のヒント

実際に関係する型がわかっている場合、または<!> quot ;: class <!> quot;で制約された型パラメーターがある場合既知の値(null、0など)を使用するのが最も簡単です。

参照型以外の制約または制約のある型パラメーターを取得したときは、default(T)を使用する必要があります。

default(Foo)は、値型と参照型の両方で機能します。 New Foo(), nullFoo.Empty()は違います。これにより、たとえば、どちらを扱っているのかわからない場合などに、ジェネリック型で使用するのに適しています。しかし、ほとんどの参照型の場合、おそらくnullで十分です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top