web-dev-qa-db-ja.com

null文字列のToString

なぜこれらの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を空の文字列に変換しているようです。

25
MartW

null参照でインスタンスメソッドToString()を呼び出すことができないためです。

MessageBox.Show()は、おそらくnullを無視して空のメッセージボックスを出力するために実装されます。

26
Axarydax

これは、MessageBox.Show()がpinvokeで実装されているためです。ネイティブのWindows MessageBox()関数を呼び出します。 lpText引数にNULLを取得してもかまいません。 C#言語には、純粋な.NETインスタンスメソッド(ToStringなど)に対してより厳密なルールがあり、常にオブジェクトがnullでないことを確認するコードを発行します。これに関するいくつかの背景情報があります ブログ投稿

13
Hans Passant

Googleでは「c#toString null」の検索でこの質問のランクが非常に高いため、Convert.ToString(null)メソッドが空の文字列を返すことを追加したいと思います。

ただし、他の回答を再確認するために、この例ではstring.Concat("string", null)を使用できます。

6
RooiWillie

舞台裏では、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.
5
James

NullでToString()メソッドを実行しようとしています。メソッドを実行するには、有効なオブジェクトが必要です。

3

.show関数は、nullをチェックして処理する必要があります。

1
rcravens

なぜなら、2番目の呼び出しは、「s」のオブジェクトがToString()メソッドの要求を満たすことを期待しているからです。そのため、.Show()が呼び出される前に、s.ToString()はメソッドを呼び出そうとして失敗しました。

興味深いことに、.Show()は正しく実装されていますが、そのようなメソッドの多くはnull以外のインスタンスが渡されることを想定しています。通常は、 NullObject パターンを使用するため、呼び出し側は処理する必要がありませんこのような動作。

0
gbvb

おそらくShowメソッドはnull値を処理し、何も表示しません。 2番目のs-s.ToString()の使用は、実行するToStringメソッドがないため失敗します。

0
user586138