なぜこれが例外をスローしないのか理解できません.objはnullです
object obj = null;
Console.WriteLine("Hello World " + obj);
なぜこれが例外をスローしないのか理解できません.objはnullです
object obj = null;
Console.WriteLine("Hello World " + obj);
これはにコンパイルされます
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;
}
パラメータをメソッドに渡しても、null
必ずしも例外がスローされるわけではありません。それはメソッドの実装次第です (その場合、おそらく が表示されますArgumentNullException
)。
*オブジェクト**のメンバーにアクセスしようとすると、常に保証された ***がスローされます。null
NullReferenceException
そう...
object obj = null;
SomeMethod(obj); // passing as parameter
object obj = null;
int hashCode = obj.GetHashCode(); // calling instance method
問題のコードの場合、渡すパラメーターConsole.WriteLine
は実際には へのコンパイルされた呼び出しの結果であり、string.Concat
値null
をパラメーターとして渡すことができ、本質的にそれらを無視します - SLaks が既に指摘したように.
*拡張方法は別の問題です。それらは「null」パラメーターで呼び出すことができます。しかし、これらはインスタンス メソッドのように振る舞うという錯覚を示すだけなので、この規則は適用されません。実際、拡張メソッドは結局のところ静的メソッドです。値の「オン」を呼び出すとnull
、事実上null
パラメーターとして渡されます。
**ここではNullable<T>
値を含めませんHasValue == false
; null
これらは多くの場合と同じように便利に扱われるかもしれませんが、これは構文上の便宜null
のためnull
です。
*** ここでは C# について話しています。SLaks がコメントで指摘しているように、これは CLI 自体のルールではありません。ただし、C# のすべてのインスタンス メソッド呼び出しは IL の命令にコンパイルされ、callvirt
インスタンスが.null
それは迷惑になるからです。ほとんどの場合、空の文字列と null 文字列の間に意味的な違いはありません。
彼らはString.IsNullOrEmptyを実装し、それを使用する方法を理解するために私たちに任せたからです。
これが実際のアプリケーションで発生する可能性がある問題がある場合は、テキストを表示する前に常に null をチェックできます。次に、代替テキストを表示することも、何も表示しないこともできます。