C# 2.0 では、null 許容型にアクセスできます。これは、データベースの DateTime 変数を null にしたい場合に非常に便利です。null 許容型を使用するときに心配する必要があることはありますか?それとも、船外に出て、すべての型を null 許容にすることはできますか?
5 に答える
ミッチのDBNullがnullでないのは良い点です。また、これは合法的なC#ですが、(幸いなことに)警告が表示されることに注意してください。
int x = 0;
// Much later
if (x == null)
違法であるように見えますが、xは暗黙的にnull許容のintに変換できるため、有効です。この警告を無視しないでください。
また、表面上、演算子とは奇妙に見えるものにも注意する必要があります。たとえば、通常は次のことを期待します。
if (x <= y || x >= y)
常に真になりますが、そうではなく、x両方yともnullです。ただし、x == ySQLとは異なり、VBとは異なり、真実になります。解除されたオペレーターの動作は、ランタイムではなく言語によって提供されるため、使用する各言語が何をするかを知っておく必要があります。
最後に、ボクシングがnull許容型でどのように機能するかを理解してください。null許容値タイプのnull以外の値は、最初はnull不可能であるかのようにボックス化され、null値は単純なnull参照にボックス化されます。(つまり、実際にはボックスは作成されません。ランタイムはnullを返すだけです)。null参照または基になる型のボックスのいずれかからnull許容値型にボックスを解除できます。それは理にかなっていますか?(C#in Depthで詳しく説明しますが、もう少し明確にできればと思います...しかし、8.45で、コーヒーを飲んだことはありません...)
編集:さて、多分例が役立つでしょう:
int? i = 5;
int? j = null;
object x = i; // x = reference to boxed int (there's no such thing as a "boxed nullable int")
object y = j; // y = null (a simple null reference)
i = (int?) x; // Unboxing from boxed int to int? is fine.
j = (int?) y; // Unboxing from a null reference to int? is fine too.
DBNullとは異なることに注意してくださいnull
また、値が実際に null 許容であることがクラスのロジックで義務付けられている場合は、null 許容型のみを使用するように注意する必要があります。これはばかげているように聞こえるかもしれませんが、「行き過ぎ」てすべてを null 可能にすると、コードが必要以上に複雑になる可能性があります。
適切な場所で使用すると、コードの品質が向上すると思いますが、冗長な場合は使用しないでください。
相互運用性が問題になる可能性があります。たとえば、COMクライアントへの公開やWebサービスとしての公開などです。
とジェネリックをGetType()使用して監視する場合に特に明らかです。new()
static void Foo<T>() where T : new()
{
T t = new T();
string s = t.ToString(); // fine
bool eq = t.Equals(t); // fine
int hc = t.GetHashCode(); // fine
Type type = t.GetType(); // BOOM!!!
}
基本的に、GetType()ではないという点で珍しいvirtualため、常に にキャスト (ボックス化) されobjectます。異常なボクシング ルールは、これが を呼び出すことを意味しますGetType()がnull、これは不可能です。したがって、空のオブジェクトGetType()があると思われる場合は、呼び出しを無効にしてください。Nullable<T>
また、一部のデータバインディングメソッドはあまり好きではないことに注意してくださいNullable<T>。