5

Visual Studio について奇妙なことに気付きました。まず、関数のどこかにこれ (C#) を入力してみてください。

class Foo  
{  
    public void Bar()  
    {  
        string s;
        int i = s.Length;
    }
}

これで、すぐにinがエラーとしてマークsされ、" " と表示されます。一方、次のコードを試してください。s.LengthUse of unassigned local variable 's'

class Foo  
{  
    private string s;
    public void Bar()  
    {  
        int i = s.Length;
    }
}

コンパイルされ、" " という警告でsinに下線が引かれます。private string sField 'Foo.s' is never assigned to, and will always have its default value null

さて、もし VS が賢くて s が常に null になることを知っているなら、なぜ 2 番目の例でその長さを取得してもエラーにならないのでしょうか? 私の当初の推測では、「コンパイラが単にその仕事を完了できない場合にのみコンパイル エラーが発生します。コードは技術的には、Bar() を呼び出さない限り実行されるため、警告にすぎません」というものでした。その説明が最初の例によって無効になることを除いて。Bar() を呼び出さない限り、エラーなしでコードを実行できます。それで、何が得られますか?単なる見落としですか、それとも何か不足していますか?

4

4 に答える 4

3

2 番目の例では、コードは有効ですが、正しく実行されない可能性があります。このプログラムが「正常に」実行される可能性があるいくつかのケースを次に示します。

  • コンパイラは 100% 正しいわけではありません。インスタンスがリフレクションによって変更された場合、"s" が null 以外の値を持つ可能性があります。
  • メソッド Bar が呼び出されない場合、プログラムはエラーなしで実行できます。
  • このプログラムは、テスト上の理由で NullReferenceException をトリガーしているテスト プログラムである可能性があります。
于 2009-09-12T09:45:53.773 に答える