0

重複の可能性:
NullReferenceExceptionが変数の名前を提供しない理由はありますか?

C#やJavaのような高級言語でさえ、どのオブジェクトタイプとインスタンス(変数)がnullであるかを見つけるメカニズムを簡単に提供できないのはなぜですか?同じためのカスタムロジックを作成する必要があります。

 ex:   SampleClass sc = null;
       sc.SomeMethod();

「オブジェクト参照がオブジェクトのインスタンスに設定されていません」という単純な例外メッセージではなく、「SampleClass型のオブジェクトscがnullです」と言いたいのですが。

4

2 に答える 2

2

ここで用語を明確にする価値があります。scオブジェクトではなく、変数です。変数の値は参照です。参照はnullの場合もあれば、実際のオブジェクトへの参照の場合もあります。

さて、なぜそれが思ったほど単純ではないのかについては...

このコードでは:

sc.SomeMethod();

...2つの操作があります。

  • scの値を実行スタックにロードします
  • 実行SomeMethodスタック上の参照を介して実行する

失敗するのは2番目の操作であり、その操作は実際には最初の操作を「認識」していません。

より多くの操作が含まれると、さらに悪化します。どうですか:

Foo().Bar().SomeMethod()

この場合、例外が表示されると思いますか?

個人的には、例外がどこから来ているのかを理解するのが難しいことはめったにありません-行番号は通常それをかなり明確にします、そしてそれが明確でない状況は通常正確に簡単に与えることができない長い表現がある状況ですとにかく例外の単一の答え。

CLR /コンパイラは、行番号マッピングのように、「IL命令Xの場合、実行スタックの最上位は診断メッセージYの式からのものでした」という追加のテーブルについて合意することができると思います。しかし、それはかなり面倒なように感じます-そして私が言うように、それはあなたにそれほど頭痛を与えるべきではありません。

于 2012-11-29T12:05:18.383 に答える
0

ほとんどの場合、それほど単純ではないからです。

たとえば、次の方法を使用します。

public int Foo(string bar)
{
    return bar.Length;
}

barnull実行時にのみ知られている要因に依存している可能性があります。それは、コンパイラが検証できるものではありません。

于 2012-11-29T11:56:46.173 に答える