なぜこれらの2番目の例外は例外を生成し、最初の例外は例外を生成しないのですか?
string s = null;
MessageBox.Show(s);
MessageBox.Show(s.ToString());
更新-私が理解できる例外、不可解なビット(私にとって)は、最初の部分に例外が表示されない理由です。以下に示すように、これはメッセージボックスとは関係ありません。
例:
string s = null, msg;
msg = "Message is " + s; //no error
msg = "Message is " + s.ToString(); //error
最初の部分は、暗黙的にnullを空の文字列に変換しているようです。
null
参照でインスタンスメソッドToString()
を呼び出すことができないためです。
MessageBox.Show()
は、おそらくnullを無視して空のメッセージボックスを出力するために実装されます。
これは、MessageBox.Show()がpinvokeで実装されているためです。ネイティブのWindows MessageBox()関数を呼び出します。 lpText引数にNULLを取得してもかまいません。 C#言語には、純粋な.NETインスタンスメソッド(ToStringなど)に対してより厳密なルールがあり、常にオブジェクトがnullでないことを確認するコードを発行します。これに関するいくつかの背景情報があります ブログ投稿 。
Googleでは「c#toString null」の検索でこの質問のランクが非常に高いため、Convert.ToString(null)
メソッドが空の文字列を返すことを追加したいと思います。
ただし、他の回答を再確認するために、この例ではstring.Concat("string", null)
を使用できます。
舞台裏では、concatがフォローアップの質問/アップデートで呼び出されています
string snull = null;
string msg = "hello" + snull;
// is equivalent to the line below and concat handles the null string for you.
string msg = String.Concat("hello", snull);
// second example fails because of the toString on the null object
string msg = String.Concat("hello", snull.ToString());
//String.Format, String.Convert, String.Concat all handle null objects nicely.
NullでToString()メソッドを実行しようとしています。メソッドを実行するには、有効なオブジェクトが必要です。
.show関数は、nullをチェックして処理する必要があります。
なぜなら、2番目の呼び出しは、「s」のオブジェクトがToString()メソッドの要求を満たすことを期待しているからです。そのため、.Show()が呼び出される前に、s.ToString()はメソッドを呼び出そうとして失敗しました。
興味深いことに、.Show()は正しく実装されていますが、そのようなメソッドの多くはnull以外のインスタンスが渡されることを想定しています。通常は、 NullObject パターンを使用するため、呼び出し側は処理する必要がありませんこのような動作。
おそらくShowメソッドはnull値を処理し、何も表示しません。 2番目のs-s.ToString()の使用は、実行するToStringメソッドがないため失敗します。