协慌网

登录 贡献 社区

在 C#中,我应该使用 string.Empty 还是 String.Empty 或 “” 来初始化字符串?

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

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

string willi = string.Empty;

或者

string willi = String.Empty;

或者

string willi = "";

还是什么?

答案

使用您和您的团队最容易阅读的内容。

其他答案表明,每次您使用""都会创建一个新字符串。这是不正确的 - 由于字符串内部,每个组件或每个 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.EmptyString.Empty 。这两者的长度是原来的六倍,并且没有额外的好处 - 当然也没有增加的清晰度,因为它们表示的是完全相同的信息。