設計エラー
C#のnullは、明らかに誤りのある解決策であり、以前の言語から考え抜かれてコピーされたものです。
- 最悪の事態:あらゆる参照型の値として、普遍的な裏切り者を使用することができます-null、コンパイラはそれに対していかなる反応もしません。 ただし、実行中にback- NullReferenceExceptionでナイフを取得するのは簡単です。 この例外の処理は無益です。つまり、コード内の無条件のエラーを意味します。
- 傷のコショウ:障害(逆参照しようとするときのNRE)は、欠陥から非常に遠く離れている可能性があります(本格的なオブジェクトが待機している場合はnullを使用します)。
- 十分に飼育された毛皮のような動物:nullは不治です-プラットフォームと言語の将来の革新は、使用を止めるのが物理的に不可能な、より古いレガシーコードから私たちを救いません。
このPandoraの箱は、偉大なHoarによってALGOL W言語が作成されたときに開かれました。Hoarは 、後に彼自身のアイデアを10億ドルの間違いと呼びました。
最高の歴史的選択肢
もちろん、それは現代の標準から明らかでした
- 意味のあるタイプと参照タイプの統一されたNullable。
- 特別な演算子( 三項演算子-?: 、 エルビス-?. 、 コアレス-?? )のみを使用したNullableデリファレンス。例外をスローせずに両方のオプション(オブジェクトの有無)の必須処理を提供します。
- 例:
object o = new object(); // - object o = null; // - , null object? n = new object; // nullable - object? n = null; // nullable - object o = n; // - , object object? object o = n ?? new object(); // fallback (coalesce), n != null Type t = n ? value.GetType() : typeof(object); // - value n, null Type? t = n ? value.GetType(); // ? - null, null, , nullable
- NRE : null , .
, . , .
, . .
null if. .
- , — .
- , ,
- (, )
- .
-
- R#
- , : null , .
Null object. , .
- null , : IEnumerable, , , .. — -.
- : — null null object, : , NRE .
. .
, null, . , , .
- .
null: , Try OrDefault . . .
CanBeNull. - NotNull.
- R#
- , NotNull
- null .
C# (, , coalesce)
- null .
- ArgumentException null NotNull .
- .
- , .
Optional. .
- NRE
- .
- , , .
- memory traffic
Maybe. LINQ , .
- .
- Optional .
- , .
- - .
-
- , .
- Code Contracts , .
- , --.
Fody/NullGuard. null .
- : , , , .
- AllowNull — , — .
- , null, AllowNull
- , .
- .
- ( null , ).
- , , null, .
- — NullGuard .
- , , .
null ( C#)
- .
- NRE .
- , ,
- .
- .
— :
4, 5, 7, 11, 12 ( ) | 1, 2 | 3, 6, 8, 9, 10 |
20 , .
.