1. ホーム
  2. c#

なぜC#とJavaには "null "が存在するのか?

2023-08-17 01:16:15

疑問点

C#(またはJava)で開発したソフトウェアの多くのバグがNullReferenceExceptionを引き起こすことに気づきました。

なぜ "null" が言語に含まれているのか、理由はあるのでしょうか?

結局のところ、"null"がなければ、バグもないわけでしょう?

つまり、nullがなければ動作しないような機能は、この言語にはないのでしょうか?

どのように解決するのか?

C#の父と呼ばれるAnders Hejlsbergは、この点について次のように語っています。 Computerworld のインタビュー :

<ブロッククオート

例えば、型システムにおいて、値型と参照型の分離や、型のnullabilityは行っていません。これは少し複雑で専門的に聞こえるかもしれませんが、C# では文字列のような参照型は null にできますが、値型は null にすることができません。この文字列は絶対にNULLにできないので、コンパイラはここでNULLポインタをヒットできないことをチェックしてほしい」と宣言することができるのです。

今日、私たちのプラットフォームで C# を使ってコーディングしている人が遭遇するバグの 50% は、おそらく null 参照例外でしょう。もし私たちが、「このパラメーターは決してヌルであってはならず、コンパイラーはコードの静的解析を行うことによって、呼び出しごとにそれをチェックしてください」と言えるような、より強力な型システムを持っていたなら。そうすれば、バグのクラスを根絶できたでしょう。

C# チームの元ソフトウェア設計エンジニアである Cyrus Najmabadi (現在は Google で働いています) は、彼のブログでこのテーマについて議論しています。( 第 1 回 , 2 番目 , 3 番目 , 4 番目 ). NULLでない型を採用する最大の障害は、記法がプログラマの習慣やコードベースを乱すことにあるようだ。C# プログラムの参照の 70% のようなものが、非 null 可能なものとして終了しそうです。

もし、本当にC#でNULLでない参照型を持ちたいのであれば、以下のものを使ってみてください。 Spec# を使ってみてください。

static string AcceptNotNullObject(object! s)
{
    return s.ToString();
}