在C#中,我想用空字符串初始化字符串值.
我该怎么做?什么是正确的方法,为什么?
string willi = string.Empty;
要么
string willi = String.Empty;
要么
string willi = "";
或者是什么?
使用您和您的团队认为最具可读性的任何内容.
其他答案表明每次使用时都会创建一个新字符串""
.这不是真的 - 由于字符串实习,它将在每个程序集创建一次或每个AppDomain创建一次(或者可能在整个过程中创建一次 - 在前面不确定).这种差异可以忽略不计-大规模,大量微不足道.
然而,您发现更具可读性是另一回事.这是主观的,因人而异 - 所以我建议你找出团队中大多数人都喜欢的东西,并且为了保持一致性,所有人都会这样做.就个人而言,我觉得""
更容易阅读.
该参数""
和" "
很容易误认为对方并没有真正和我一起洗.除非你使用比例字体(并且我没有与任何开发人员合作过),否则很容易区分它们.
从性能和代码生成的角度来看,确实没有区别.在性能测试中,它们之间来回徘徊,其间哪一个比另一个快,并且只有毫秒.
在查看幕后代码时,您实际上也看不出任何差异.唯一的区别在于IL,它string.Empty
使用操作码ldsfld
并""
使用操作码ldstr
,但这只是因为它string.Empty
是静态的,并且两个指令都做同样的事情.如果你看一下生产的组件,它就完全一样了.
private void Test1() { string test1 = string.Empty; string test11 = test1; } private void Test2() { string test2 = ""; string test22 = test2; }
.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
最好的代码根本就没有代码:
编码的基本性质是,作为程序员,我们的任务是认识到我们做出的每一个决定都是权衡.[...] 从简洁开始.根据测试要求增加其他尺寸.
因此,更少的代码是更好的代码:不想""
给string.Empty
或String.Empty
.这两个是六倍长,没有额外的好处 - 当然没有额外的清晰度,因为他们表达完全相同的信息.
一个区别是,如果您使用switch-case
语法,则无法编写,case string.Empty:
因为它不是常量.你得到一个Compilation error : A constant value is expected
请查看此链接以获取更多信息: string-empty-versus-empty-quotes
我宁愿string
到String
.选择string.Empty
了""
是选择一个,并与它坚持的问题.使用的优点string.Empty
是你的意思非常明显,你不会意外地复制"\x003"
在你的不可打印的字符""
.
我不打算进入,但我看到一些错误的信息被扔到这里.
我个人更喜欢string.Empty
.这是个人偏好,我会根据具体情况与我合作的任何团队的意愿保持一致.
正如一些人所说,没有什么区别之间的所有string.Empty
和String.Empty
.
另外,这是一个鲜为人知的事实,使用""是完全可以接受的.在其他环境中,""的每个实例都将创建一个对象.但是,.NET会中断其字符串,因此将来的实例将从实际池中提取相同的不可变字符串,并且任何性能损失都可以忽略不计.资料来源:布拉德艾布拉姆斯.
我个人更喜欢"",除非有充分的理由去做更复杂的事情.
String.Empty
并且string.Empty
是等价的.String
是BCL类名; string
是它的C#别名(或快捷方式,如果你愿意的话).与Int32
和相同int
.有关更多示例,请参阅文档.
就""
我而言,我不太确定.
就个人而言,我总是使用string.Empty
.
几乎每个开发人员都会知道""意味着什么.我个人遇到的String.Empty在第一时间,不得不花一些时间搜索谷歌弄清楚,如果他们真的是完全一样的事情.
这个话题很老很长,请原谅我这个行为是否已经在其他地方提到过了.(并指出我的答案)
如果您使用string.Empty
或双引号,我发现编译器的行为有所不同.如果您不使用使用string.Empty或双引号初始化的字符串变量,则会显示差异.
在初始化的情况下,string.Empty
然后编译器警告
CS0219 - The variable 'x' is assigned but its value is never used
在使用双引号进行初始化的情况下,您将获得预期的消息.
此链接的Connect文章中解释了此行为:https://connect.microsoft.com/VisualStudio/feedback/details/799810/c-warning-cs0219-not-reported-when-assign-non-constant-value
基本上,如果我做对了,他们希望允许程序员使用函数的返回值设置变量以进行调试,而不会给他带来警告消息,因此他们仅在使用常量赋值和字符串时限制警告.空不是常数而是场.
我在控制台应用程序中使用以下方法执行了这个非常简单的测试
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 }
这清楚地表明,所有三个变量,即str1
,str2
和str3
虽然使用不同的语法被初始化都指向完全相同的字符串中存储对象(零长度的).我在.NET 4.5控制台应用程序中执行了此测试.所以内部他们没有区别,这一切都归结为你想用作程序员的方便性.字符串类的这种行为在.NET中称为字符串实习.Eric Lippert 在这里有一个非常好的博客描述了这个概念.
以上任何一种.
教导有许多更好的东西.比如什么颜色的树皮最适合树,我认为模糊的棕色与青苔苔藓.
我非常喜欢String.Empty,除了其他原因,以确保您知道它是什么,并且您没有意外删除内容,但主要是为了国际化.如果我在引号中看到一个字符串,那么我总是想知道这是否是新代码并且应该放入字符串表中.因此,每次代码更改/审核时,您需要查找"引号中的内容",是的,您可以过滤掉空字符串,但我告诉人们,除非您知道它不会被本地化,否则永远不要将字符串放在引号中.
string
是System.String
类型的同义词,它们是相同的.
值也相同: string.Empty == String.Empty == ""
我不会用字符常量""中的代码,而string.Empty
或String.Empty
-更容易看出是什么意思程序员.
间string
和String
我喜欢小写string
更多的只是因为我曾经与德尔福合作了很多年,德尔福的风格是小写string
.
所以,如果我是你的老板,你就会写作 string.Empty
没有人提到在VisualStudio中字符串的颜色编码与字符串不同.这对可读性很重要.此外,小写通常用于变量和类型,但不是很大,但String.Empty是常量而不是var或类型.
我没有什么区别.最后一个是尽快输入:)
我宁愿这样做string.Empty
,String.Empty
因为您可以使用它而无需using System;
在文件中包含a 。
至于采摘""
了string.Empty
,这是个人喜好,应该由你的团队来决定。