在 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
。这两者的长度是原来的六倍,并且没有额外的好处 - 当然也没有增加的清晰度,因为它们表示的是完全相同的信息。