在C#中,我应该使用string.Empty还是String.Empty或“”来intitialize一个字符串?
在C#中,我想用一个空字符串初始化一个字符串值。
我应该怎么做? 什么是正确的方式,为什么?
string willi = string.Empty;
要么
string willi = String.Empty;
要么
string willi = "";
或者是什么?
使用任何你和你的团队发现的最具可读性。
其他答案建议每次使用""
时都会创建一个新字符串。 这不是真的 - 由于字符串interning,它会创建一个程序集或每个AppDomain一次(或可能一次为整个过程 - 不知道在这方面)。 这种差异是微不足道的 - 大量的,大量的微不足道的。
然而,你发现更具可读性的是另一回事。 这是主观的,会因人而异 - 所以我建议你找出你的团队中大多数人喜欢的东西,并且都是为了一致性。 我个人发现""
更易于阅读。
""
和" "
很容易被误认为对方的论点并不真正与我一起洗。 除非您使用比例字体(并且我没有与任何开发人员合作),否则很容易区分。
从性能和代码生成的角度来看,确实没有什么区别。 在性能测试中,他们之间来回切换,其中一个比另一个快,而且只有几毫秒。
在查看幕后代码时,你确实没有看到任何区别。 唯一的区别是在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
最好的代码根本就没有代码:
编码的基本性质是,作为程序员,我们的任务是认识到我们做出的每一个决定都是一种折衷。 [...] 从简洁开始。 根据测试要求增加其他维度。
因此,更少的代码是更好的代码:首选""
为string.Empty
或String.Empty
。 这两个是六倍 ,没有额外的好处 - 当然没有增加清晰度,因为他们表达了完全相同的信息。
上一篇: In C#, should I use string.Empty or String.Empty or "" to intitialize a string?