10

なぜこれが例外をスローしないのか理解できません.objはnullです

object obj = null;
Console.WriteLine("Hello World " + obj);
4

5 に答える 5

21

これはにコンパイルされます

Console.WriteLine(String.Concat("Hello World ", obj));

String.Concatメソッドはパラメーターを無視しnullます。

次のように定義されています: (.Net 参照ソースから)

    public static String Concat(Object arg0, Object arg1) {
        if (arg0==null) {
            arg0 = String.Empty; 
        }

        if (arg1==null) { 
            arg1 = String.Empty;
        } 
        return Concat(arg0.ToString(), arg1.ToString());
    }

arg1.ToString()ifを単純に返さない理由がわかりませんarg0==null

メソッドは次のString.Concat(string, string)ように定義されます。

    public static String Concat(String str0, String str1) { 
        if (IsNullOrEmpty(str0)) { 
            if (IsNullOrEmpty(str1)) {
                return String.Empty; 
            }
            return str1;
        }

        if (IsNullOrEmpty(str1)) {
            return str0; 
        } 

        int str0Length = str0.Length; 

        String result = FastAllocateString(str0Length + str1.Length);

        FillStringChecked(result, 0,        str0); 
        FillStringChecked(result, str0Length, str1);

        return result; 
    }
于 2010-07-22T19:16:36.997 に答える
3

パラメータをメソッドに渡しても、null必ずしも例外がスローされるわけではありません。それはメソッドの実装次第です (その場合、おそらく が表示されますArgumentNullException)。

*オブジェクト**のメンバーにアクセスしようとすると、常に保証された ***がスローされます。nullNullReferenceException

そう...

例外をスローする場合とスローしない場合があります

object obj = null;
SomeMethod(obj); // passing as parameter

間違いなく例外をスローします

object obj = null;
int hashCode = obj.GetHashCode(); // calling instance method

問題のコードの場合、渡すパラメーターConsole.WriteLineは実際には へのコンパイルされた呼び出しの結果であり、string.Concatnullをパラメーターとして渡すことができ、本質的にそれらを無視します - SLaks が既に指摘したように.


*拡張方法は別の問題です。それらは「null」パラメーターで呼び出すことができます。しかし、これらはインスタンス メソッドのように振る舞うという錯覚を示すだけなので、この規則は適用されません。実際、拡張メソッドは結局のところ静的メソッドです。値の「オン」を呼び出すとnull、事実上nullパラメーターとして渡されます。

**ここではNullable<T>値を含めませんHasValue == false; nullこれらは多くの場合と同じように便利に扱われるかもしれませんが、これは構文上の便宜nullのためnullです。

*** ここでは C# について話しています。SLaks がコメントで指摘しているように、これは CLI 自体のルールではありません。ただし、C# のすべてのインスタンス メソッド呼び出しは IL の命令にコンパイルされcallvirtインスタンスが.null

于 2010-07-22T19:20:28.583 に答える
1

それは迷惑になるからです。ほとんどの場合、空の文字列と null 文字列の間に意味的な違いはありません。

于 2010-07-22T19:21:01.563 に答える
0

彼らはString.IsNullOrEmptyを実装し、それを使用する方法を理解するために私たちに任せたからです。

于 2010-07-22T19:24:50.460 に答える
0

これが実際のアプリケーションで発生する可能性がある問題がある場合は、テキストを表示する前に常に null をチェックできます。次に、代替テキストを表示することも、何も表示しないこともできます。

于 2010-07-22T19:19:42.763 に答える