C# String.Empty和“”;空的呢?

C# String.Empty和“”;空的呢?,c#,.net,C#,.net,可能重复: ”是否等同于字符串。为空 初始化字符串值时首选哪个?string.Empty,因为它是一个静态变量,而不是必须创建新字符串的“”,null表示必须将字符串设置为字符串的新实例 (感谢您的更正)使用string.Empty被认为是更好的做法,但是它们实际上是相等的。但是,它们与null不同。是。和字符串。空的,但请 String.Empty和“”之间的差异非常小,但是有一个 差别。“实际上是创造了一个 对象,它可能会被从字符串实习生池和字符串中拉出。空不会创建任何对象,所以如果您真的

可能重复:

是否等同于
字符串。为空


初始化字符串值时首选哪个?

string.Empty,因为它是一个静态变量,而不是必须创建新字符串的“”,null表示必须将字符串设置为字符串的新实例


(感谢您的更正)

使用string.Empty被认为是更好的做法,但是它们实际上是相等的。但是,它们与null不同。

是。和字符串。空的,但请

String.Empty和“”之间的差异非常小,但是有一个 差别。“实际上是创造了一个 对象,它可能会被从字符串实习生池和字符串中拉出。空不会创建任何对象,所以如果您真的在寻找最终的 内存效率,我建议String.Empty。 然而,你应该记住,区别是如此的琐碎,你将 就像从未在你的代码中看到它一样

如果要表示没有值,请使用
null

如果要表示存在值,但该值是空字符串,请使用
String.Empty

FROM

此字段的值是长度为零的字符串“”


在应用程序代码中,此字段最常用于将字符串变量初始化为空字符串的赋值。要测试字符串的值是否为string.:.Empty,请使用IsNullOrEmpty方法。

它们相等。但是String.Empty是常量


“”-是创建字符串的方法

使用您认为最容易阅读的内容

我向任何人提出挑战,要求他们找到一个性能差异显著的现实应用程序。。。这不会发生的。然而,不同的人发现不同的方法更具可读性

就个人而言,我是一个
人。我发现它不那么凌乱,而且我从来没有遇到过一个我实际上偶然使用了
(或类似的东西)的问题。(这是经常提出的反对意见之一。)

如果你喜欢
string.Empty
,我当然不会说你“错了”。然而,我建议,如果你在一个团队中工作,你可以讨论一下,找出大多数人认为更具可读性的内容,并坚持下去。一致性通常是一件好事


编辑:只是为了减轻一些担心,这些担心可能是由声明“”将创建一个新字符串引起的。。。它可能会创建一个新字符串一次(可能是每个
AppDomain
,可能是每个进程;我不确定,这真的不重要)。它不会在每次使用时创建新字符串。例如,考虑这个代码:

public void Foo()
{
    string x = "";
    for (int i=0; i < 10000000; i++)
    {
        string y = "";
        // Do something here
    }
    string z = "";
}
public void Foo()
{
字符串x=“”;
对于(int i=0;i<10000000;i++)
{
字符串y=“”;
//在这里做点什么
}
字符串z=“”;
}

我们保证
x
y
z
将引用相同的字符串。最多,调用
Foo
将意味着只创建一个空字符串,并且仅在您第一次调用它时,并且仅在您尚未在程序中的任何其他地方使用空字符串文字的情况下创建。上面的代码不会创建1000万个新字符串。

您要寻找的答案在这里


使用String.Empty

是的,我的想法是,如果你太在意内存,就不应该使用.Net:p从技术上讲,String.Empty不是一个常数。这是一个静态只读字段。如果它是一个常量,则“”和string之间没有区别。Empty.string.Empty不是常量,而是字段。它的支持值是一个常量,但字符串有一些限制。Empty不是常量。例如,不能将其用作switch语句的case子句中的值。请注意,“”可能会创建一个额外的字符串。并不是每次你遍历代码时都会创建一个新字符串。至少在C#术语中,string.Empty不是一个常量。这是一个公共静态只读字段。实际上,“”是一个文字常量,而String.Empty根本不是常量,所以您可以将其反转。相当重要的是,它也是只读的:)我想说,由于缺少字符串。Unknown,null也可以用于表示未知值(以及无值)。是否
null
表示
不存在
存在但未知
取决于您在程序中使用它的方式,开发人员应将代码弄清楚或记录下来。但是肯定绝对不应该有
字符串.Unknown
,因为它不属于class
字符串
Dupe。“它可能会创建一个新字符串一次”-为什么会这样做?我原以为空字符串文字“”已经在实习生池中,因为它已被string.empty属性引用。@Joe:我怀疑在某些情况下不会,但它们可能是涉及CompilerRelaxations.NoStringInterning之类的复杂情况。我强烈怀疑它通常不会创建任何字符串,但就性能而言,“最多一个”已经足够好了,并且在奇怪的情况下不太可能出错:)
public void Foo()
{
    string x = "";
    for (int i=0; i < 10000000; i++)
    {
        string y = "";
        // Do something here
    }
    string z = "";
}