在C#中,我应该使用string.Empty或String.Empty或“”intitialize一个string?

在C#中,我想用一个空string初始化一个string值。

我应该怎么做? 什么是正确的方式,为什么?

string willi = string.Empty; 

要么

 string willi = String.Empty; 

要么

 string willi = ""; 

或者是什么?

使用任何你和你的团队发现最可读的。

其他答案build议每次使用""时创build一个新的string。 这是不正确的 – 由于stringinterning,它会创build一个程序集或每个AppDomain一次(或可能一次为整个过程 – 不知道在这方面)。 这种差异是微不足道的 – 大量,微不足道。

然而,你发现更可读的是另一回事。 这是主观的,会因人而异 – 所以我build议你找出你的团队中大多数人都喜欢的东西,并且为了保持一致, 我个人觉得更容易阅读。

""" "这个说法很容易被误认为是对的, 除非你使用比例字体(而且我还没有和任何开发人员合作过),否则很容易区分。

从性能和代码生成的angular度来看,确实没有什么区别。 在性能testing中,他们之间来回跳动,其中一个比另一个快,而且只有毫秒。

在看后面的代码,你真的没有看到任何区别。 唯一的区别是在IL中,哪个string.Empty使用操作码ldsfld""使用操作码ldstr ,但那只是因为string.Empty是静态的,并且两个指令都做同样的事情。 如果您查看生产的组件,则完全相同。

C#代码

 private void Test1() { string test1 = string.Empty; string test11 = test1; } private void Test2() { string test2 = ""; string test22 = test2; } 

IL代码

 .method private hidebysig instance void Test1() cil managed { // Code size 10 (0xa) .maxstack 1 .locals init ([0] string test1, [1] string test11) IL_0000: nop IL_0001: ldsfld string [mscorlib]System.String::Empty IL_0006: stloc.0 IL_0007: ldloc.0 IL_0008: stloc.1 IL_0009: ret } // end of method Form1::Test1 
 .method private hidebysig instance void Test2() cil managed { // Code size 10 (0xa) .maxstack 1 .locals init ([0] string test2, [1] string test22) IL_0000: nop IL_0001: ldstr "" IL_0006: stloc.0 IL_0007: ldloc.0 IL_0008: stloc.1 IL_0009: ret } // end of method Form1::Test2 

汇编代码

  string test1 = string.Empty; 0000003a mov eax,dword ptr ds:[022A102Ch] 0000003f mov dword ptr [ebp-40h],eax string test11 = test1; 00000042 mov eax,dword ptr [ebp-40h] 00000045 mov dword ptr [ebp-44h],eax 
  string test2 = ""; 0000003a mov eax,dword ptr ds:[022A202Ch] 00000040 mov dword ptr [ebp-40h],eax string test22 = test2; 00000043 mov eax,dword ptr [ebp-40h] 00000046 mov dword ptr [ebp-44h],eax 

最好的代码根本就没有代码 :

编码的基本性质是,作为程序员,我们的任务是认识到我们做出的每一个决定都是一个权衡。 […] 从简洁开始。 根据testing要求增加其他维度。

因此,更less的代码是更好的代码:首选""string.EmptyString.Empty 。 这两个是六倍 ,没有额外的好处 – 当然没有增加清晰度,因为他们expression了完全相同的信息。

一个区别是,如果使用switch-case语法,则不能写入case string.Empty:因为它不是常量。 您会收到Compilation error : A constant value is expected

看看这个链接的更多信息: string空与空引号

我宁愿stringString 。 selectstring.Empty ""是select一个并坚持它的问题。 使用string.Empty好处是你的意思是非常明显的,你不会不小心复制你的"" "\x003"等非打印字符。

我不打算进去,但是我看到一些错误的信息在这里被扔掉了。

我个人比较喜欢string.Empty 。 这是一种个人喜好,我会根据具体情况倾向于与我一起工作的任何团队的意愿。

正如其他人所说, string.EmptyString.Empty之间完全没有什么区别。

此外,这是一个鲜为人知的事实,使用“”是完全可以接受的。 在其他环境中,每个“”的实例都会创build一个对象。 然而,.NET实习它的string,所以未来的实例将从实习池拉相同的不变string,任何性能命中将可以忽略不计。 来源: 布拉德·艾布拉姆斯 。

我个人比较喜欢“”,除非有更好的理由给更复杂的东西。

String.Emptystring.Empty是等价的。 String是BCL类名称; string是它的C#别名(或快捷方式,如果你愿意的话)。 与Int32int相同。 有关更多示例,请参阅文档 。

""而言,我并不确定。

就个人而言,我总是使用string.Empty

几乎所有的开发者都会知道“”是什么意思。 我个人第一次遇到了String.Empty,不得不花费一些时间来search谷歌,弄清楚他们是否真的完全一样的东西。

这个话题是相当老旧的,所以请原谅,如果这种行为已经在其他地方被提到。 (并指出我所涵盖的答案)

如果使用string.Empty或双引号,我发现编译器的行为有所不同。 如果不使用用string.Empty或双引号初始化的stringvariables,则会显示其差异。

如果使用string.Empty进行初始化,则编译器警告

 CS0219 - The variable 'x' is assigned but its value is never used 

永远不会发射,而在使用双引号进行初始化的情况下,您将获得预期的消息。

此行为在此链接的“连接”文章中进行了解释: https : //connect.microsoft.com/VisualStudio/feedback/details/799810/c-warning-cs0219-not-reported-when-assign-non-constant-value

基本上,如果我正确的做了,他们希望程序员可以用一个函数的返回值设置一个variables来进行debugging,而不用打扰他的警告信息,因此他们只在costant赋值和string的情况下才会限制警告。空不是一个常数,而是一个场。

我在控制台应用程序中使用以下function执行了这个非常简单的testing

 private static void CompareStringConstants() { string str1 = ""; string str2 = string.Empty; string str3 = String.Empty; Console.WriteLine(object.ReferenceEquals(str1, str2)); //prints True Console.WriteLine(object.ReferenceEquals(str2, str3)); //prints True } 

这清楚地表明,所有三个variables,即str1str2str3虽然使用不同的语法进行初始化,但却指向内存中完全相同的string(长度为零)。 我在.Net 4.5控制台应用程序中执行了这个testing。 所以在内部他们没有区别,这一切都归结为一个你想用作程序员的便利。 在.Net中,string类的这种行为被称为string interning 。 Eric Lippert 在这里描述这个概念有一个很好的博客。

以上任何一项。

有很多更好的东西要教化。 比如什么颜色的树皮最适合树,我觉得模糊的棕色和杜尔塞苔藓的颜色。

我没有区别。 最后一个是键入尽快:)

我强烈喜欢String.Empty,除了其他原因,以确保你知道它是什么,你没有意外删除的内容,但主要是为了国际化。 如果我在引号中看到一个string,那么我总是想知道这是不是新代码,应该把它放到一个string表中。 所以每次代码改变/审查,你需要寻找“引用的东西”,是的,你可以过滤掉空的string,但我告诉人们,这是一个很好的做法,永远不要把string引号,除非你知道它不会得到本地化。

没有人提到VisualStudiostring中的颜色编码不同于string。 这对于可读性来说很重要。 此外,小写字母通常用于variables和types,不是一个大问题,但是String.Empty是一个常量,而不是一个variables或types。

stringSystem.Stringtypes的同义词,它们是相同的。

值也是相同的: string.Empty == String.Empty == ""

我不会在代码中使用字符常量“”,而是使用string.EmptyString.Empty – 更容易看到程序员的意思。

stringString我喜欢小写string更多的是因为我曾经使用Delphi很多年,Delphi风格是小写string

所以,如果我是你的老板,你会写string.Empty

没关系 – 他们完全一样。 但是,主要的是你必须保持一致

我一直都在和这种“什么是正确的事情”斗争。

我用第三,但其他两个第一看起来不那么奇怪。 string是string的别名,但在分配中看到它们感觉不到。

前两者中的任何一个都可以接受。 我会避免最后一个,因为通过在引号之间加一个空格来引入一个bug相对容易。 这个特殊的错误很难通过观察find。 假设没有错别字,所有的都是语义上相同的。

[编辑]

此外,您可能总是要使用stringString来保持一致性,但这只是我。

这完全是一个代码风格的偏好,做如何.NET处理string。 不过,这里是我的意见:)

在访问静态方法,属性和字段时,我始终使用BCLtypes名称: String.EmptyInt32.TryParse(...)Double.Epsilon

在声明新实例时,我总是使用C#关键字: int i = 0; 或者string foo = "bar";

我很less使用未声明的string文字,因为我喜欢能够扫描代码以将它们组合成可重复使用的命名常量。 编译器用常量replace常量,所以这更多地避免了魔法string/数字,并给它们一个更多的含义。 另外更改值更容易。

我会赞成string.Empty String.Empty因为你可以使用它,而不需要包含using System; 在你的文件中。

至于选string.Empty "" string.Empty ,则是个人喜好,应由您的团队决定。

编译器应该从长远来看都是一样的。 select一个标准,以便您的代码易于阅读,并坚持下去。

我只是在看一些代码,这个问题突然出现在我之前读过的一些问题上。 这当然是一个可读性的问题。

考虑下面的C#代码…

 (customer == null) ? "" : customer.Name 

VS

 (customer == null) ? string.empty : customer.Name 

我个人觉得后者不太模糊,也比较容易阅读。

正如其他人所指出的那样,实际差异是微不足道的。

我认为第二个是“正确的”,但说实话我不认为这很重要。 编译器应该足够聪明,可以将其中的任何一个编译成完全相同的字节码。 我自己用“”。

http://blogs.msdn.com/b/brada/archive/2003/04/22/49997.aspx

正如David所暗示的, String.Empty""之间的区别很小,但是有一个区别。 ""实际上创build一个对象,它可能会被拉出stringintern池,但仍然…而String.Empty创build没有对象…所以如果你真的在寻找内存效率最终,我build议String.Empty 。 不过,你应该记住,差异是如此琐碎你会喜欢永远不会在你的代码中看到它…
至于System.String.Emptystring.EmptyString.Empty …我的关怀水平低;-)

我个人亲眼目睹了“两次”造成(次要)问题。 曾经是由于一个初级开发人员错误的新的基于团队的编程,另一个是一个简单的错字,但事实是使用string.Empty会避免这两个问题。

是的,这是一个非常重要的判断,但是当一种语言给了你多种方式去做事的时候,我倾向于倾向于编译器监督最多,编译时间最强的那种语言。 那不是 “”。 这完全是为了expression特定的意图。

如果你inputstring.EMpty或Strng.Empty,编译器会让你知道你做错了。 立即。 它根本不会编译。 作为一名开发人员,您正在引用编译器(或另一个开发人员)不能以任何方式误解的具体意图,而当您做错了时,您不能创build错误。

如果你的意思是“”或“反过来”,那么编译器会很高兴地做你告诉它做的事情。 另一个开发者可能会或可能无法收集您的具体意图。 Bug创build。

在string.Empty之前,我已经使用了一个定义了EMPTY_STRING常量的标准库。 我们仍然在不允许使用string.Empty的case语句中使用该常量。

只要有可能,就让编译器为你工作,消除人为错误的可能性,不pipe多小。 国际海事组织,这与其他人所引用的一样,胜过“可读性”。

特定性和编译时间的执行。 这是晚餐。

我使用“”,因为它会在我的代码中显着地黄色…出于某种原因String.Empty在我的Visual Studio代码主题中全是白色的。 而且我认为这对我来说最重要。

虽然差异非常小,但差异依然存在。

1)“”创build对象,而String.Empty不创build对象。 但是这个对象会被创build一次,如果你在代码中有另外一个“”,那么以后会被从string池中引用。

2)string和string是相同的,但我会build议使用String.Empty(以及String.Format,String.Copy等),因为点符号表示类,而不是操作符,并且以大写字母开头的类符合C#编码标准。