ヌル素晴らしいとひどい

設計エラー


C#のnullは、明らかに誤りのある解決策であり、以前の言語から考え抜かれてコピーされたものです。


  1. 最悪の事態:あらゆる参照型の値として、普遍的な裏切り者を使用することができます-null、コンパイラはそれに対していかなる反応もしません。 ただし、実行中にback- NullReferenceExceptionでナイフを取得するのは簡単です。 この例外の処理は無益です。つまり、コード内の無条件のエラーを意味します。
  2. 傷のコショウ:障害(逆参照しようとするときのNRE)は、欠陥から非常に遠く離れている可能性があります(本格的なオブジェクトが待機している場合はnullを使用します)。
  3. 十分に飼育された毛皮のような動物:nullは不治です-プラットフォームと言語の将来の革新は、使用を止めるのが物理的に不可能な、より古いレガシーコードから私たちを救いません。

このPandoraの箱は、偉大なHoarによってALGOL W言語が作成されたときに開かれました。Hoarは 、後に彼自身のアイデアを10億ドルの間違いと呼びました。


最高の歴史的選択肢


もちろん、それは現代の標準から明らかでした


  1. 意味のあるタイプと参照タイプの統一されたNullable。
  2. 特別な演算子( 三項演算子-?:エルビス-?.コアレス-?? )のみを使用したNullableデリファレンス。例外をスローせずに両方のオプション(オブジェクトの有無)の必須処理を提供します。
  3. 例:
    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
  4. NRE : null , .

, . , .



, . .


  1. null if. .


    1. , — .
    2. , ,
    3. (, )
    4. .

  2. NotNull.


    1. R#
    2. , : null , .

  3. Null object. , .


    1. null , : IEnumerable, , , .. — -.
    2. : — null null object, : , NRE .

  4. . .


    1. , null, . , , .


    2. .

  5. null: , Try OrDefault . . .


  6. CanBeNull. - NotNull.


    1. R#
    2. , NotNull
    3. null .

  7. C# (, , coalesce)


    1. null .
    2. ArgumentException null NotNull .
    3. .
    4. , .

  8. Optional. .


    1. NRE
    2. .
    3. , , .
    4. memory traffic

  9. Maybe. LINQ , .


    1. .
    2. Optional .
    3. , .
    4. - .

  10. .


    1. , .
    2. Code Contracts , .
    3. , --.

  11. Fody/NullGuard. null .


    1. : , , , .
    2. AllowNull — , — .
    3. , null, AllowNull
    4. , .
    5. .
    6. ( null , ).
    7. , , null, .
    8. — NullGuard .
    9. , , .

  12. null ( C#)


    1. .
    2. NRE .
    3. , ,
    4. .
    5. .



— :


4, 5, 7, 11, 12 ( )1, 23, 6, 8, 9, 10

20 , .



.



Source: https://habr.com/ru/post/J309462/


All Articles