我应该使用哪个空字符串?为什么?

可能重复:
String.Empty和“”之间有什么区别

我应该使用以下哪一项来分配空字符串,为什么?

string variableName = ""; 

要么

 string variableName = string.Empty; 

String.Empty是通常建议的。

为什么? 因为它传达了意义,所以你非常明确地说你希望字符串为空。

另外, ""创建一个字符串对象(该对象将在应用程序中重用,因为.NET中的字符串是实例化的), String.Empty不会创建新对象。 看到这里 。

使用您的项目或团队风格指南所说的任何内容 如果你没有,请暂时聊聊它,选择一个并持续使用它。

从技术上讲,两者都是相同的,并导致相同的代码。 String.Empty表示实例空字符串(“”)的实例。 由于所有代码内字符串常量都是自动实现的,因此“”代表完全相同的空字符串实例(更新:在程序集内,请参阅下面的更新)。


顺便说一下,我正在使用“”。 它简短,清晰,易读。

String.Empty在使用reflection等的通用代码中很有用。当你不关心你拥有什么类时,只想获得空值,例如使用默认值进行初始化。


更新:看起来并不那么简单。 单个应用程序域中可能存在许多实习字符串实例。 而行为取决于框架版本。 有关更多信息,请参阅Eric Lippert的String interning和String.Empty以及String.Intern方法的Reference中的备注。

但是第二个链接表明,自3.5 SP1以来,还有单个实习“”,因为它应该是第一位的。 那么,为什么在编程时会烦恼呢? 项目需要一些时间才能完成。 考虑改进编译器,框架和工具……并且不要过早优化。 可读性,一致性和正确性更为重要。

使用String.Empty而不是“”是很好的。

 myString = “” creates a new instance of type String. myString = String.Empty does not. 

编辑

误解是使用空引用的字符串总是实例化一个新对象。 为什么我这样说呢? 请注意,.NET会中断其字符串,因此将来的实例将从实际池中提取相同的不可变字符串,并且任何性能命中都可以忽略不计。 在计算机科学中,字符串实习是一种只存储每个不同字符串值的一个副本的方法,该字符串值必须是不可变的。 实习字符串使得一些字符串处理任务需要更多的时间或空间效率,代价是在创建或实现字符串时需要更多时间。 不同的值存储在字符串实习池中。

每个字符串的单个副本称为“实习生”,通常由字符串类的方法查找。 如果“”创建一个对象而String.Empty没有,那么这意味着什么。 但是这个对象将被创建一次,如果代码中有另一个“”,将在稍后从字符串池中引用。

字符串实习在运行应用程序时保留字符串的哈希表。 如果创建了具有相同内容的字符串,则不会发生新的堆分配,而是返回对现有(相同)字符串的引用。 请记住,每个字符串文字不一定会产生新的字符串实例。

String.Empty与“”(双引号)之间的区别

String.Empty vs“”vs String。 IsNullOrEmpty

没关系,它与MSDN文章中描述的没有任何区别。

String.Empty字段

该字段的值是零长度字符串“”。

可以在这里找到一篇解释""string.Empty之间差异的好文章。

来自文章:

“在这里我们深入研究了string.Empty,首先看看如何在程序中使用它,然后查看它在切换中不起作用的原因。此外,我们发现它为C#编译器提供的关于代码的信息少于最后,我们看到C#编译器可以完全删除使用“”的某些指令,但不能使用string.Empty的指令。“

从我所读到的内容来看,行为没有区别,两者之间的效率差异很小(非常轻微的边缘转向string.Empty)。 所以你选择哪一个并不重要,没有实际的区别。

最好使用string.Empty不是“”。

string.Empty是比“”更可读的代码。

最好使用string variableName = string.Empty; not string variableName = "";

注意: "" Net 3.0及更高版本没有对象创建。 ""和“String.Empty”相同。

但在.Net 2.0中, ""将创建一个新实例而不是String.Empty

在C#中,我应该使用string.Empty或String.Empty或“”来初始化字符串吗?

http://www.ecma-international.org/publications/standards/Ecma-334.htm

" """看起来很相似。 如果你不能错误地抓住" "里面的空间

然后" "可以传递String.IsNullOrEmpty() 。 并取得意想不到的结果