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

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

string willi = string.Empty;

or

string willi = String.Empty;

or

string willi = "";

还是别的什么?


当前回答

我本来不想插嘴的,但我发现这里有一些错误的信息。

我个人更喜欢字符串。这是个人喜好,我会根据具体情况服从与我合作的任何团队的意愿。

正如其他人所提到的,字符串和字符串之间根本没有区别。Empty和String.Empty。

此外,这是一个鲜为人知的事实,使用“”是完全可以接受的。在其他环境中,“”的每个实例都将创建一个对象。然而,. net会实习它的字符串,因此未来的实例将从实习池中提取相同的不可变字符串,任何性能损失都可以忽略不计。来源:布拉德·艾布拉姆斯。

其他回答

我只是在看一些代码,然后这个问题突然出现在我的脑海里,这个问题是我以前读过的。这当然是可读性的问题。

考虑下面的c#代码…

(customer == null) ? "" : customer.Name

vs

(customer == null) ? string.empty : customer.Name

我个人认为后者不那么模棱两可,也更容易阅读。

正如其他人指出的那样,实际的差异可以忽略不计。

http://blogs.msdn.com/b/brada/archive/2003/04/22/49997.aspx:

As David implies, there difference between String.Empty and "" are pretty small, but there is a difference. "" actually creates an object, it will likely be pulled out of the string intern pool, but still... while String.Empty creates no object... so if you are really looking for ultimately in memory efficiency, I suggest String.Empty. However, you should keep in mind the difference is so trival you will like never see it in your code... As for System.String.Empty or string.Empty or String.Empty... my care level is low ;-)

从性能和代码生成的角度来看,确实没有什么区别。在性能测试中,它们在哪个比另一个更快之间来回切换,而且仅以毫秒计。

在查看幕后代码时,您也看不到任何不同。唯一的区别在于IL,即字符串。空使用操作码ldsfld ""使用ldstr操作码,但这只是因为字符串。Empty是静态的,两个指令做相同的事情。 如果你看一下生产出来的组件,它是完全一样的。

c#代码

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是BCL类名;字符串是它的c#别名(或快捷方式,如果你愿意)。与Int32和int相同。更多示例请参见文档。

至于“”,我不太确定。

就我个人而言,我总是使用string.Empty。

我亲眼目睹了两次“导致(小)问题”。一次是由于一个刚接触基于团队编程的初级开发人员的错误,另一次是一个简单的拼写错误,但事实是使用了字符串。空本来可以避免这两个问题。

是的,这在很大程度上是一种判断,但是当一种语言提供了多种方法来做事情时,我倾向于使用具有最多编译器监督和最强编译时强制的语言。那不是“”。这一切都是为了表达具体的意图。

如果你输入字符串。EMpty或string。空,编译器让你知道你做错了。立即。它根本不会编译。作为一个开发人员,你引用的是编译器(或其他开发人员)不能以任何方式误解的特定意图,当你做错了,你不能创建一个bug。

如果你输入“”当你想要“”时,反之亦然,编译器会很高兴地执行你让它做的事情。其他开发人员可能无法收集到您的特定意图。Bug。

早在字符串出现之前。Empty是我使用的标准库,它定义了EMPTY_STRING常量。我们仍然在case语句中使用这个常量。不允许为空。

只要可能,让编译器为你工作,并消除人为错误的可能性,无论多么小。在我看来,这比“可读性”更重要。

专用性和编译时强制。这是晚餐要吃的。