在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.Empty
或String.Empty
。 这两个是六倍 ,没有额外的好处 – 当然没有增加清晰度,因为他们expression了完全相同的信息。
一个区别是,如果使用switch-case
语法,则不能写入case string.Empty:
因为它不是常量。 您会收到Compilation error : A constant value is expected
看看这个链接的更多信息: string空与空引号
我宁愿string
到String
。 selectstring.Empty
""
是select一个并坚持它的问题。 使用string.Empty
好处是你的意思是非常明显的,你不会不小心复制你的""
"\x003"
等非打印字符。
我不打算进去,但是我看到一些错误的信息在这里被扔掉了。
我个人比较喜欢string.Empty
。 这是一种个人喜好,我会根据具体情况倾向于与我一起工作的任何团队的意愿。
正如其他人所说, string.Empty
和String.Empty
之间完全没有什么区别。
此外,这是一个鲜为人知的事实,使用“”是完全可以接受的。 在其他环境中,每个“”的实例都会创build一个对象。 然而,.NET实习它的string,所以未来的实例将从实习池拉相同的不变string,任何性能命中将可以忽略不计。 来源: 布拉德·艾布拉姆斯 。
我个人比较喜欢“”,除非有更好的理由给更复杂的东西。
String.Empty
和string.Empty
是等价的。 String
是BCL类名称; string
是它的C#别名(或快捷方式,如果你愿意的话)。 与Int32
和int
相同。 有关更多示例,请参阅文档 。
就""
而言,我并不确定。
就个人而言,我总是使用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,即str1
, str2
和str3
虽然使用不同的语法进行初始化,但却指向内存中完全相同的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。
string
是System.String
types的同义词,它们是相同的。
值也是相同的: string.Empty == String.Empty == ""
我不会在代码中使用字符常量“”,而是使用string.Empty
或String.Empty
– 更容易看到程序员的意思。
string
和String
我喜欢小写string
更多的是因为我曾经使用Delphi很多年,Delphi风格是小写string
。
所以,如果我是你的老板,你会写string.Empty
没关系 – 他们完全一样。 但是,主要的是你必须保持一致
我一直都在和这种“什么是正确的事情”斗争。
我用第三,但其他两个第一看起来不那么奇怪。 string是string的别名,但在分配中看到它们感觉不到。
前两者中的任何一个都可以接受。 我会避免最后一个,因为通过在引号之间加一个空格来引入一个bug相对容易。 这个特殊的错误很难通过观察find。 假设没有错别字,所有的都是语义上相同的。
[编辑]
此外,您可能总是要使用string
或String
来保持一致性,但这只是我。
这完全是一个代码风格的偏好,做如何.NET处理string。 不过,这里是我的意见:)
在访问静态方法,属性和字段时,我始终使用BCLtypes名称: String.Empty
或Int32.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.Empty
或string.Empty
或String.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#编码标准。
- 无法在Web服务器上启动debugging。 无法启动ASP.NETdebuggingVS 2010,II7,Win 7 x64
- 在没有Visual Studio 2010的情况下安装MSBuild 4.0
- ConfigurationManager.AppSettings – 如何修改和保存?
- 使用Resharper在Visual Studio自动格式化中断行和包装
- Visual Studio 2010:无法parsingmscorlib目标框架“.NETFramework,版本= v4.0”
- WebAPI和WebAPI 2有什么区别?
- 在.NET 4.0项目中引用.NET 2.0混合模式程序集时需要什么“附加configuration”?
- 你如何从一个MemoryStream获得一个string?
- 自我跟踪实体的目的是什么?