default(Foo)、Foo.Empty、またはnullを使用する必要がありますか?
-
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(), null
とFoo.Empty()
は違います。これにより、たとえば、どちらを扱っているのかわからない場合などに、ジェネリック型で使用するのに適しています。しかし、ほとんどの参照型の場合、おそらくnull
で十分です。