空字符串上的ToString

时间:2011-01-25 12:39:22

标签: c# string exception null tostring

为什么第二个产生异常而第一个产生异常?

string s = null;
MessageBox.Show(s);
MessageBox.Show(s.ToString());

更新 - 我能理解的例外,令人费解的一点(对我来说)是第一部分没有显示异常的原因。这与Messagebox没有任何关系,如下所示。

例如:

string s = null, msg;
msg = "Message is " + s; //no error
msg = "Message is " + s.ToString(); //error

第一部分似乎是隐式地将null转换为空字符串。

7 个答案:

答案 0 :(得分:26)

因为您无法在ToString()引用上调用实例方法null

并且MessageBox.Show()可能实现为忽略null并打印出空消息框。

答案 1 :(得分:13)

这是因为MessageBox.Show()是用pinvoke实现的,它调用本机的Windows MessageBox()函数。哪个不介意为lpText参数获取NULL。 C#语言对纯.NET实例方法(如ToString)有更严格的规则,它总是发出代码来验证对象不是null。这个blog post中有一些背景信息。

答案 2 :(得分:5)

在你的后续问题/更新E.g

中调用了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.

答案 3 :(得分:3)

您正尝试在null上执行ToString()方法。您需要一个有效的对象才能执行方法。

答案 4 :(得分:1)

.show函数必须具有空值检查并处理它。

答案 5 :(得分:0)

因为,第二个调用是期望“s”的对象满足ToString()方法请求。所以,在调用.Show()之前,s.ToString()会在尝试调用方法时失败。

有趣的是,虽然.Show()是正确实现的,但是很多这样的方法都希望传入非null实例。通常,这就是当你使用NullObject模式时,调用者不应该处理这种行为。

答案 6 :(得分:0)

可能Show方法处理空值而只显示任何内容。 s - s.ToString()的第二次使用失败,因为您没有运行ToString方法。