这是有效的C#代码
var bob = "abc" + null + null + null + "123"; // abc123
这不是有效的C#代码
var wtf = null.ToString(); // compiler error
为什么第一个语句是有效的?
发布于 2012-05-30 18:17:32
因为C#中的+
操作符在内部转换为String.Concat
,这是一个静态方法。此方法恰好将null
视为空字符串。如果你在Reflector中查看String.Concat
的源代码,你会看到它:
// while looping through the parameters
strArray[i] = (str == null) ? Empty : str;
// then concatenate that string array
(MSDN也提到了:http://msdn.microsoft.com/en-us/library/k9c94ey1.aspx)
另一方面,ToString()
是一个实例方法,您不能在null
上调用它(null
应该使用什么类型?)。
发布于 2012-05-30 22:40:00
在.net之前的COM框架中,任何接收到字符串的例程都必须在处理完字符串后将其释放。由于在例程中传入和传出空字符串非常常见,而且尝试“释放”空指针被定义为合法的无操作操作,因此Microsoft决定使用空字符串指针来表示空字符串。
为了实现与COM的一些兼容性,.net中的许多例程将空对象解释为空字符串的合法表示形式。通过对.net及其语言(最显著的是允许实例成员指示“不作为虚拟调用”)进行一些细微的更改,微软可以使声明类型字符串的null
对象行为更像空字符串。如果微软这样做了,它还必须使Nullable<T>
的工作方式稍有不同(以便允许Nullable<String>
--这是他们无论如何都应该做的事情)和/或定义一个NullableString
类型,该类型基本上可以与String
互换,但不会将null
视为有效的空字符串。
实际上,在某些情况下,null
会被视为合法的空字符串,而在另一些情况下,则不会被视为合法的空字符串。通常,如果stringValue
为null
,则stringValue.someMember
形式的表达式将失败,但是大多数接受字符串作为参数的框架方法和操作符都会将null
视为空字符串。
发布于 2012-05-31 20:19:24
'+'
是一个中缀运算符。就像任何操作符一样,它实际上是在调用一个方法。您可以想象一个非中缀版本的"wow".Plus(null) == "wow"
实现者已经决定了这样的事情...
class String
{
...
String Plus(ending)
{
if(ending == null) return this;
...
}
}
所以..。你的例子变成了
var bob = "abc".Plus(null).Plus(null).Plus(null).Plus("123"); // abc123
,它与
var bob = "abc".Plus("123"); // abc123
null在任何时候都不会变成字符串。所以null.ToString()
和null.VoteMyAnswer()
没有什么不同。;)
https://stackoverflow.com/questions/10814282
复制相似问题