首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么连接空字符串而不调用"null.ToString()“是有效的?

为什么连接空字符串而不调用"null.ToString()“是有效的?
EN

Stack Overflow用户
提问于 2012-05-30 18:15:12
回答 5查看 16.9K关注 0票数 133

这是有效的C#代码

代码语言:javascript
复制
var bob = "abc" + null + null + null + "123";  // abc123

这不是有效的C#代码

代码语言:javascript
复制
var wtf = null.ToString(); // compiler error

为什么第一个语句是有效的?

EN

回答 5

Stack Overflow用户

发布于 2012-05-30 18:17:32

因为C#中的+操作符在内部转换为String.Concat,这是一个静态方法。此方法恰好将null视为空字符串。如果你在Reflector中查看String.Concat的源代码,你会看到它:

代码语言:javascript
复制
// 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应该使用什么类型?)。

票数 109
EN

Stack Overflow用户

发布于 2012-05-30 22:40:00

在.net之前的COM框架中,任何接收到字符串的例程都必须在处理完字符串后将其释放。由于在例程中传入和传出空字符串非常常见,而且尝试“释放”空指针被定义为合法的无操作操作,因此Microsoft决定使用空字符串指针来表示空字符串。

为了实现与COM的一些兼容性,.net中的许多例程将空对象解释为空字符串的合法表示形式。通过对.net及其语言(最显著的是允许实例成员指示“不作为虚拟调用”)进行一些细微的更改,微软可以使声明类型字符串的null对象行为更像空字符串。如果微软这样做了,它还必须使Nullable<T>的工作方式稍有不同(以便允许Nullable<String>--这是他们无论如何都应该做的事情)和/或定义一个NullableString类型,该类型基本上可以与String互换,但不会将null视为有效的空字符串。

实际上,在某些情况下,null会被视为合法的空字符串,而在另一些情况下,则不会被视为合法的空字符串。通常,如果stringValuenull,则stringValue.someMember形式的表达式将失败,但是大多数接受字符串作为参数的框架方法和操作符都会将null视为空字符串。

票数 9
EN

Stack Overflow用户

发布于 2012-05-31 20:19:24

'+'是一个中缀运算符。就像任何操作符一样,它实际上是在调用一个方法。您可以想象一个非中缀版本的"wow".Plus(null) == "wow"

实现者已经决定了这样的事情...

代码语言:javascript
复制
class String
{
  ...
  String Plus(ending)
  {
     if(ending == null) return this;
     ...
  }
} 

所以..。你的例子变成了

代码语言:javascript
复制
var bob = "abc".Plus(null).Plus(null).Plus(null).Plus("123");  // abc123

,它与

代码语言:javascript
复制
var bob = "abc".Plus("123");  // abc123

null在任何时候都不会变成字符串。所以null.ToString()null.VoteMyAnswer()没有什么不同。;)

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10814282

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档