799 Stimmen

In C#, sollte ich string.Empty oder String.Empty oder "" verwenden, um eine Zeichenfolge zu intitialisieren?

In C# möchte ich einen String-Wert mit einer leeren Zeichenfolge initialisieren.

Wie soll ich das machen? Was ist der richtige Weg, und warum?

string willi = string.Empty;

oder

string willi = String.Empty;

oder

string willi = "";

oder was?

886voto

Jon Skeet Punkte 1325502

Verwenden Sie das, was für Sie und Ihr Team am lesbarsten ist.

Andere Antworten besagen, dass jedes Mal eine neue Zeichenkette erstellt wird, wenn Sie die "" . Das stimmt nicht - aufgrund des String-Internings wird er entweder einmal pro Assembly oder einmal pro AppDomain (oder möglicherweise einmal für den gesamten Prozess - da bin ich mir nicht sicher) erstellt. Dieser Unterschied ist vernachlässigbar - massiv, Massiv unbedeutend.

Welche Sie als lesenswerter empfinden, ist jedoch eine andere Frage. Das ist subjektiv und variiert von Person zu Person - ich schlage also vor, dass Sie herausfinden, was die meisten Leute in Ihrem Team mögen, und sich dann aus Gründen der Konsistenz daran orientieren. Persönlich finde ich "" leichter zu lesen.

Das Argument, dass "" y " " leicht miteinander verwechselt werden können, finde ich nicht besonders gut. Es sei denn, Sie verwenden eine Proportionalschrift (und ich habe nicht mit jede Entwickler, die das tun), ist der Unterschied ziemlich leicht zu erkennen.

402voto

aBetterGamer Punkte 4989

Von der Leistung und der Codegenerierung her gibt es eigentlich keinen Unterschied. Bei den Leistungstests ging es hin und her, wer schneller war als der andere, und das nur um Millisekunden.

Wenn man sich den Code hinter den Kulissen anschaut, sieht man eigentlich auch keinen Unterschied. Der einzige Unterschied liegt in der AWL, die string.Empty den Opcode verwenden ldsfld y "" verwendet den Opcode ldstr aber nur, weil string.Empty ist statisch, und beide Anweisungen bewirken das Gleiche. Wenn Sie sich die erzeugte Baugruppe ansehen, ist es genau dasselbe.

C#-Code

private void Test1()
{
    string test1 = string.Empty;    
    string test11 = test1;
}

private void Test2()
{
    string test2 = "";    
    string test22 = test2;
}

IL-Code

.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

Code für die Montage

        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

93voto

Konrad Rudolph Punkte 503837

Der beste Code ist gar kein Code :

Es liegt in der Natur des Programmierens, dass wir als Programmierer erkennen müssen, dass jede Entscheidung, die wir treffen, einen Kompromiss darstellt. [ ] Beginnen Sie mit der Kürze. Erhöhen Sie die anderen Dimensionen, wie es die Tests erfordern.

Folglich ist weniger Code besserer Code: Bevorzugen Sie "" a string.Empty o String.Empty . Diese beiden sind sechsmal länger ohne zusätzlichen Nutzen - und schon gar nicht ohne zusätzliche Klarheit, da sie genau dieselbe Information ausdrücken.

60voto

Mentoliptus Punkte 2768

Ein Unterschied besteht darin, dass Sie bei Verwendung einer switch-case Syntax, können Sie nicht schreiben case string.Empty: weil es sich nicht um eine Konstante handelt. Sie erhalten eine Compilation error : A constant value is expected

Unter diesem Link finden Sie weitere Informationen: string-empty-versus-empty-quotes

49voto

Jimmy Punkte 85199

Ich würde es vorziehen string a String . wählen string.Empty über "" ist eine Frage der Wahl und der Beibehaltung. Vorteil der Verwendung string.Empty ist es sehr offensichtlich, was Sie meinen, und Sie kopieren nicht versehentlich nicht druckbare Zeichen wie "\x003" in Ihrem "" .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X