2010-09-12 13 views
9

, wenn ich so etwas tun ...C#: Verwirrung über ToUpper() und ToLower()

String myVar = "in"; 
if(myVar.ToUpper() == "in") 
{ 
    //do something 
} 

Dies ist nicht im Inneren gehen wird "wenn" Block ..right?

oder

Wird es sowohl für die „in“ und „IN“ zu überprüfen und tun, was im Innern, dass es, wenn? Wenn ja, warum? Sollte es nicht überspringen, was im "if" Block ist?

Gleiche Verwirrung über ToLower() zu

bearbeiten: Also für beide Fälle zu überprüfen, muss ich schreiben:

if((myVar.ToUpper().Equals("in"))&&(myVar.Equals("in"))) 

Wie this..right?

+1

Jon's Rat ist solide, aber ich würde gerne erklären, was oben falsch gelaufen ist. Wenn Sie prüfen wollen, ob es "in" ist und sich nicht um Groß-/Kleinschreibung kümmert, können Sie entweder "Nachher" und mit "In" oder "ToUpper" vergleichen und mit "IN" vergleichen. Sie brauchen nicht mehrere Vergleiche. In jedem Fall empfehle ich, was Jon empfohlen hat. –

Antwort

43

Anstatt in Großbuchstaben umzuwandeln und dann zu vergleichen, sollten Sie einen Gleichheitsvergleich verwenden, bei dem die Groß- und Kleinschreibung nicht beachtet werden muss. Zum Beispiel:

if (myVar.Equals("in", StringComparison.OrdinalIgnoreCase)) 
{ 
    ... 
} 

Sie sollten sorgfältig prüfen genau, welche Regeln sind sinnvoll - Ordnungs, die aktuelle Kultur, die invariante Kultur, oder vielleicht eine ganz andere Kultur (zum Beispiel unter Verwendung von StringComparer.Create(culture, true)).

Weitere Details hierzu finden Sie im Artikel MSDN Best Practices for Using Strings in the .NET Framework.

+0

+1 für (bisher) die einzige Antwort, die erwähnt "Kultur" neben Klein- und Großbuchstaben. – stakx

+0

Für if-Aussagen stimme ich Ihnen vollkommen zu, aber was ist mit switch-Anweisung von Strings? Ich habe irgendwo gelesen, dass es am besten ist, String in Großbuchstaben zu konvertieren, z. switch (myVar.ToUpper()) {case "MYCASE1": ...} –

+0

@ mjf196: Das kommt auf den Kontext an - was wird hier in Großbuchstaben geschrieben? Wenn es Benutzereingaben sind, müssen Sie wirklich darüber nachdenken, was genau das Verhalten sein soll. –

2

"IN" ist nicht gleich "in" - daher wird der if-Block nicht ausgeführt. Im Fall von toLower() würde er den if-Block als "in" gleich "in" ausführen.

5

Der Ausdruck something.ToUpper().Equals("lowercaseletters") wird niemals wahr sein, daher wird der if-Block in Ihrem Beispiel nicht ausgeführt. Das gilt natürlich auch für ToLower. something.ToLower().Equals("UPPERCASE") wird auch nie wahr sein.

2

zuerst, wenn Sie Zeichenfolgen verwenden vergleichen wollen .Equals()

myVar.toUpper().Equals("in") 

Zweite zuerst alle Code in der, wenn ausgeführt wird, erst danach die Rückkehr geprüft.

so

String myVar="in"; 
if(myVar.toUpper().Equals("in")) 
{ 
    //do something 
} 

nicht "etwas tun".

+1

Ok, ich beiße: Warum "Equals" verwenden? –

+0

Steven: Fampinheiro schreibt anscheinend in Java, wo "Equals" erforderlich ist, weil '==' für Strings nicht überladen ist. – Gabe

+0

In einigen Sprachen vergleicht der Operator "==" zwei Objektreferenzen, um festzustellen, ob sie sich auf dieselbe Instanz beziehen. Ich glaube nicht, dass dies in C# der Fall ist; Der Operator ruft String :: Equals unter der Haube auf. Es vergleicht aber immer noch die Byte-für-Byte-Werte, so dass Sie wahrscheinlich wollen. Compare() – RJFalconer

2

Wenn Sie etwas tun, wie Sie gesagt haben, wird es nicht gehen in den Block, wenn, und hier ist der Grund:

Operatoren auf der linken Seite auf das Objekt angewendet werden. So Ihr Code ist das gleiche wie das Schreiben dieses:

String myVar="in"; 
String testVar = myVar.ToUpper(); 
if(testVar=="in") //This will never be true 
{ 
    //do something 
} 

In Ihrem bearbeiten, Sie testen immer noch nicht, ob die Zeichenfolge ist == „IN“, Sie 2 Tests tun, um zu sehen, wenn Ihr String == "im".

Wenn Sie Ihr Original auf das geändert würde es funktionieren:

String myVar="in"; 
if(myVar.ToUpper()=="IN") 
{ 
    //do something 
} 

Ihre bearbeiten wie diese beiden Fälle zu prüfen sein sollte:

if((myVar.ToUpper().Equals("IN"))&&(myVar.Equals("in"))) 

EDIT: Einige weitere Erklärung von Steven Kommentar:

if((myVar.ToUpper().Equals("IN"))&&(myVar.Equals("in"))) 

Dieses Codebeispiel führt 2 Vergleiche durch, aber wenn myVar nur eine gemischte Fallversion sein wird s von in (IE: in In IN IN) ist dann der zweite Vergleich nicht notwendig. Sobald ich die Zeichenfolge in ToUpper() konvertiert habe, müssen Sie nur überprüfen, ob es gleich IN ist. So würde ich diese Zeile mit ersetzen:

if(myVar.ToUpper().Equals("IN")) 

oder

if(myVar.ToUpper() == "IN") 

Ich persönlich würde die Verwendung == nicht die .Equals Methode.

+0

Ich sehe nicht den Punkt, beide Tests zu machen. Wenn der zweite wahr ist, wird der erste auch sein. Ebenso weiß ich nicht, warum Sie 'Equals' verwenden. Machst du? –

+0

@Steven Ich verwende es, weil das OP in seinen Fragen verwendet hat. In der zweiten Situation haben Sie Recht. Ich benutze es einfach, was das OP benutzt. – thorkia

+0

Nun, das erklärt es, aber ich versichere Ihnen, dass unsere Antworten nicht verpflichtet sind, irgendwelche Fehler von den Fragen zu wiederholen. :-) –