9

私は VS2008 ( http://msdn.microsoft.com/en-us/devlabs/dd491992.aspx ) でコード コントラクトを使用してきました。
それらは確かに優れており、メソッド内の if-then-throw チェックの確実な代替手段を提供します。

それにもかかわらず、null 非許容の参照型に対して私が強く感じているニーズを満たすことができることを望んでいました。
残念ながら、私が見る限り、そうではないようです。
これは私が理解したものです:

  • このようなものは、実行時に問題を引き起こします。
    MyClass a = null;
    a.ToString();

  • より簡潔で合理化された方法であっても、チェックを明示的に記述する必要があります。

  • VS Team System を使用しない限り、コード コントラクトを使用して実行時にチェックすることしかできず、コンパイル時にメリットはありません。
    何か問題が発生した場合でも、処理する必要があることを意味します。
    単純な例外の処理と大差ありません。

  • VSTS の静的分析を使用しても、実行時に行われる分析ほど効果的ではありません。
    これは完全に理解できますが、この機能がランタイムでの使用を意図していることを示すもう 1 つの兆候です。

私が間違っている場合は修正してください。ただし、コード コントラクトが私の生活を楽にし、null 非許容の参照型のようにプログラムをより堅牢にする方法はありません。

誤解しないでほしいのですが、私はコード コントラクトが嫌いではありません。
それらは、フレームワーク全体に対する非常に優れた拡張機能です。
ただ、null 非許容の参照型を持たないことによって C# が残したギャップをこれで埋められない場合、現時点では何も埋められないのではないかと心配しています。
どう思いますか?

4

5 に答える 5

20

これについてはあなたが正しいと思います。コンパイル時の null 非許容参照チェックは、Code Contracts で待ち望んでいたキラー機能でしたが、実際にはありません。

これが何を意味するのか疑問に思っている人は、値の型との類推を考えてみてください。元々は nullable ではありませんでしたが、型名の後に疑問符を付けると、null 許容になりました。

int? n;

一貫性のために、同じことが参照型にも当てはまれば理想的です。しかし、それは既存のすべての C# プログラムを破壊するため、選択肢ではありません。研究言語Spec#では、感嘆符の接尾辞を使用して、null 不可を意味しています。

string! s = "Hello";

通常の値型と同様に、コンパイラは、変数が初期化される前に、どのコード パスでも使用されていないことを静的にチェックしstring!ます (Spec# では、宣言と初期化を同じステートメントで行う必要があると思います)。

nullまた、その変数への代入も禁止します。

そしてもちろん、stringa への通常の代入を禁止しstring!ます。では、2 種類のタイプの間のギャップを埋めるにはどうすればよいでしょうか。小切手を書くことによって:

string x = GetStringFromSomewhere();

if (x != null)
    s = x; // okay because compiler sees null check

悲しいことに、ほとんどのプログラムの参照変数の大部分は、プログラムが正しい場合、null 非許容である可能性が高いということです。null 許容変数は少数派です。それでも、それらはデフォルトです。

1960 年代のもう 1 つの悪い考えです。

于 2009-10-04T10:19:09.163 に答える
3

「null 非許容参照型」によってどのような問題が解決されるのかはわかりません。わかりましたので、このコードは例外をスローする可能性がはるかに低くなります:-

a.ToString();

しかし、それはnull不可であるため、もう正しい可能性がありますか? の初期値はa? おそらく、タイプのデフォルトの「空」インスタンスです。その場合、値が割り当てられているはずの値に値が割り当てられていないため、デバッグがより困難になる可能性が高くなりません。例外を発生させるのではなく、デフォルトの動作をするだけでは、私が望んでいるようには思えません。

于 2009-10-01T09:39:39.980 に答える
3

null 非許容参照型の概念は、データベース フィールドにマップされる ORM 生成プロパティに非常に役立つと思います。多くの場合、プロパティ (通常は文字列型) からは、基になるフィールドが null 可能かどうかを判断できません。疑問符を探すだけで、null 許容値型を使用できます。

明らかな foo を除けば、静的チェックについてはあまり心配していません。=ヌル; 失敗しましたが、インテリセンスは可変的な意図へのヒントとして非常に役立つと思います。

于 2010-08-19T02:50:08.293 に答える
-2

null を使用する代わりに、string.empty のようなデフォルトを使用できます。null は必要ありません。

于 2009-11-02T03:08:01.983 に答える