为什么将该物业string foo = string.Empty
列入BCL?似乎比仅使用空字符串(string foo = ""
)更冗长,更清晰
typeof(string).GetField("Empty").SetValue(null, " ");
public static string Empty { get { return string.Intern(""); } }
?
为什么将该物业string foo = string.Empty
列入BCL?似乎比仅使用空字符串(string foo = ""
)更冗长,更清晰
typeof(string).GetField("Empty").SetValue(null, " ");
public static string Empty { get { return string.Intern(""); } }
?
Answers:
我只能在这里假设:
string.Empty
为明确起见已定义-在初始化字符串时,从上下文中可能并不清楚""
确实确实是初始化程序(而不是在测试过程中null
说" "
或仅充当占位符)的上下文。使用string.Empty
是对这种难题的肯定答案。
这也可能是对C的抛弃-C中的空字符串不是空字符串。它是一个字符数组,其第一个字符为null(因此为空),与C#不同。我的意思是,在不同的语言中,您将以不同的方式表示一个空字符串(并且它们可能具有不同的含义)- string.Empty
避免了此类歧义。
与其他人对多个对象的说法相反,这不是问题,因为任何字符串文字都会在编译时被保留。这包括价值string.Empty
- ""
。任何时候只要在代码中重复上述任何一个,就会从内部池中检索该对象。每个应用程序域都是如此。
""
,您会得到{'\0'}
,因此空字符串文字和其他定义它的回旋方式之间没有区别。
我不确定自己从哪里学到的资源,但是使用它的一些要点包括:
.NET程序集中的每个字符串都是唯一的,因此具有
string foo = "";
string bar = "";
由于字符串是不可变的,因此在输出程序集中产生2个字符串。具有两个参考string.Empty
可以减小组件的尺寸。
string.Empty
意图时,很明显它应该是一个空字符串。但是,如果遇到foo = ""
这种情况,程序员是否在测试时删除了字符串的内容,却忘记了将其添加回去,还是应该这样呢?""
/ string.Empty
被拘禁,并且只会创建一个对象。
不会为创建对象string.Empty
。使用""
将创建一个对象,该对象很可能来自字符串实习生池。
过去,人们已经进行过测试,并且String.Empty
发布速度稍快,但这是微观优化。
String.Empty是这样的:
//The Empty constant holds the empty string value.
//We need to call the String constructor so that the compiler doesn't mark
//this as a literal.
//Marking this as a literal would mean that it doesn't show up as a field
//which we can access from native.
public static readonly String Empty = "";
这是优化内存消耗和优化字符串比较的问题。每次在应用程序中使用空字符串时,都将分配一个包含0个字符的字符串对象。至于字符串比较,可以通过比较引用(指针)而不是逐个字符来完成,即使对于空字符串,这也更快。
如果您在应用程序中多次使用相同的字符串,则可以通过对字符串调用String.Intern()来使用相同的机制。但是,如果每个字符串仅使用一次,则只会使用更多的内存。
因此,String.Empty只是对大多数.Net应用程序值得进行的特殊情况的优化,这就是将其集成到BCL中的原因。
有关此主题的更多详细信息,我强烈建议阅读Eric Lippert的博客文章。
您还应该查看他的博客文章引用的此文档。