为什么第二个产生异常而第一个产生异常?
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转换为空字符串。
答案 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
中调用了concatstring 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方法。