2009-01-11 8 views
11

Ist es möglich, einen Schalter in C# zu haben, der prüft, ob der Wert Null oder nicht "" sondern String.Empty ist? Ich weiß, ich kann dies tun:C# Switch mit String.IsNullOrEmpty

switch (text) 
{ 
    case null: 
    case "": 
     break; 
} 

Gibt es etwas besser, denn ich will nicht eine große Liste von IF-Anweisungen haben?

I'mm versuchen zu ersetzen:

if (String.IsNullOrEmpty(text)) 
    blah; 
else if (text = "hi") 
    blah 
+0

Ich wusste nicht, dass es einen Unterschied zwischen String.Empty und "" war. Was ist der Unterschied? – recursive

+0

Es gibt keine. Auf der Content-Ebene ist es genauso. Die Referenz ist anders. String.Empty gibt immer dieselbe Instanz zurück, während "" eine andere Instanz zurückgibt. –

+2

Ich bin Preety sicher zwei "" wird eigentlich das gleiche Objekt sein, da .net Praktikanten die Zeichenfolgen, aber nicht positiv. object.ReferenceEquals gibt an, dass sie identisch sind. – JoshBerke

Antwort

28

Ich würde so etwas wie die folgenden Vorschlag:

switch(text ?? String.Empty) 
{ 
    case "": 
     break; 
    case "hi": 
     break; 
} 

Ist das, was du suchst nach?

5

wie etwa

if (string.isNullOrEmpty(text)) 
{ 
    //blah 
} 
else 
{ 
switch (text) 
{ 
    case "hi": 
} 

}

+0

Die Frage war, if-else-Anweisungen zu vermeiden. –

+1

Wenn man sich die Editierhistorie anschaut, enthielt die ursprüngliche Frage nichts anderes ;-) – JoshBerke

+0

Auch das vermeidet den Stil von if-Klauseln, um die er sich sorgte, wenn man nur eine einzige hat, wenn nicht anders. – JoshBerke

3

Vom documentation von String.Empty:

Der Wert dieses Feldes ist die Zeichenfolge der Länge Null "".

ich das interpretieren, dass es keinen Unterschied zwischen "" und String.Empty. Warum versuchen Sie, zwischen ihnen zu unterscheiden?

+0

Ich war mir nicht sicher, ob es einen Unterschied zwischen "" und "String.Empty" hinsichtlich der Kultur (Unicode ascii etc.) gab. – maxfridbe

21

Was ist falsch an Ihrem Beispiel switch Aussage?

switch (text) 
{ 
    case null: 
    case "": 
     foo(); 
     break; 
    case "hi": 
     bar(); 
     break; 
} 

Es funktioniert (und aus irgendeinem Grund, der mich überrascht - ich dachte, es würde sich beschweren oder Absturz auf dem null Fall), und es ist klar.

Für die Frage, warum machen Sie sich Sorgen über String.Empty? Mir fehlt hier etwas.

+0

Ich habe nicht einmal versucht, dies zu tun, also null funktioniert hmmm ... – JoshBerke

3

Eine leere Zeichenfolge ist "", die gleich String.Empty ist. Der Grund, dass Sie können setzen "" in einer case-Anweisung, aber nicht "String.Empty" ist, dass "Empty" ist ein Feld der Klasse "String" und "" ist eigentlich ein contant Wert.

Konstante Werte sind in Fällen zulässig, String.Empty ist ein Feld und kann zur Laufzeit geändert werden. (In diesem Fall bleibt es gleich, aber nicht alle statischen Felder jeder Klasse sind konstante Werte.)

Im Fall von 'if' wird diese Bedingung zur Laufzeit ausgewertet und wenn nicht erfordert a konstanter Wert.

Ich hoffe, das erklärt warum.

3

Etwas, was ich gerade bemerkt habe ist, dass Sie kombinieren können, wenn/else und Anweisungen wechseln! Sehr nützlich, wenn Vorbedingungen überprüft werden müssen.

if (string.IsNullOrEmpty(text)) 
{ 
    //blah 
} 
else switch (text) 
{ 
    case "hi": 
     Console.WriteLine("How about a nice game of chess?"); 
     break; 
    default: 
     break; 
} 
+2

Jemand wies auf einen verwandten Beitrag auf SO, dass dies nicht wirklich die Anweisungen kombiniert, aber die Else-Klausel ist nur ohne die geschweiften Klammern, so Der Schalter ist die einzige Anweisung, die ausgeführt wird. Das ist syntaktisch dasselbe wie Joshs Antwort. Ich denke aber, es sieht gut aus. –

0
string StrMode; 
if (!string.IsNullOrEmpty(StrMode)) 
{ 
    switch (StrMode.Trim()) 
    { 
     case "Souse": 
     { 
      //Statement Eg: 
      MesssageBox.Show("Souse"); 
      break; 
     } 

     case "Company Agent": 
     { 
      //Statement Eg: 
      MesssageBox.Show("Souse"); 
      break; 
     } 

     default: 
      return; 
    } 
}