Da die statische Version der .Equal
Methode wurde bisher noch nicht erwähnt, ich möchte dies hier hinzufügen, um die 3 Varianten zusammenzufassen und zu vergleichen.
MyString.Equals("Somestring")) //Method 1
MyString == "Somestring" //Method 2
String.Equals("Somestring", MyString); //Method 3 (static String.Equals method) - better
donde MyString
ist eine Variable, die von einer anderen Stelle des Codes stammt.
Hintergrundinformationen und zur Sommerzeit:
In Java mit ==
zum Vergleich von Zeichenketten sollte nicht verwendet werden. Ich erwähne dies für den Fall, dass Sie beide Sprachen verwenden müssen und auch um Sie darauf hinzuweisen, dass die Verwendung von ==
kann auch durch etwas Besseres in C# ersetzt werden.
In C# gibt es keinen praktischen Unterschied für den Vergleich von Strings mit Methode 1 oder Methode 2, solange beide vom Typ String sind. Wenn jedoch eine Zeichenfolge null ist, eine Zeichenfolge von einem anderen Typ ist (z. B. ein Integer) oder eine Zeichenfolge ein Objekt mit einem anderen Verweis darstellt, kann es sein, dass der Vergleich der Inhalte auf Gleichheit nicht das Ergebnis liefert, das Sie erwarten, wie die erste Frage zeigt.
Vorgeschlagene Lösung:
Denn mit ==
ist nicht genau dasselbe wie die Verwendung von .Equals
Wenn Sie Dinge vergleichen, können Sie die static String.Equals Methode an. Wenn die beiden Seiten nicht vom gleichen Typ sind, können Sie auf diese Weise trotzdem den Inhalt vergleichen, und wenn eine der beiden Seiten null ist, wird die Ausnahme vermieden.
bool areEqual = String.Equals("Somestring", MyString);
Es ist etwas aufwendiger zu schreiben, aber meiner Meinung nach sicherer in der Anwendung.
Hier sind einige Informationen, die von Microsoft kopiert wurden:
public static bool Equals (string a, string b);
Parameter
a
Zeichenfolge
Die erste zu vergleichende Zeichenkette, oder null
.
b
Zeichenfolge
Die zweite zu vergleichende Zeichenkette, oder null
.
Rückgabe Boolean
true
wenn der Wert von a
ist derselbe wie der Wert von b
; sonst, false
. Wenn beide a
y b
sind null
gibt die Methode true
.
4 Stimmen
Siehe auch: stackoverflow.com/questions/144530/or-equals
19 Stimmen
String-Überschreibungen
==
, aber die Operatoren sind nicht polymorph. In diesem Code ist die==
Operator wird für den Typobject
die einen Identitätsvergleich anstelle eines Wertevergleichs durchführt.25 Stimmen
Um den Kommentar von @DrewNoakes zu ergänzen: Der Compiler wählt eine
==
Überladung auf der Grundlage des Kompilierzeittyps der Operanden. DieContent
Eigenschaft istobject
. Operatoren sind nicht virtuell, so dass die Standardimplementierung von==
aufgerufen wird, was einen Vergleich der Referenzgleichheit ergibt. Bei Equals geht der Aufruf an die virtuelle Methodeobject.Equals(object)
;string
überschreibt diese Methode und führt einen ordinalen Vergleich mit dem String-Inhalt durch. Siehe msdn.microsoft.com/de-us/library/fkfd9eh8(v=vs.110).aspx y referencesource.microsoft.com/#mscorlib/system/string.cs,507 .8 Stimmen
Die Erklärung von @phoog ist präzise. Es sollte beachtet werden, dass, wenn die linke Seite von
==
hat zur Kompilierzeit den Typobject
und die rechte Seite hat zur Kompilierzeit den Typstring
dann muss der C#-Compiler die (in diesem Fall problematische) Überladungoperator ==(object, object)
; aber es wird eine Warnung zur Kompilierzeit ausgeben, dass dies unbeabsichtigt sein könnte. Also lesen die Kompilierzeit-Warnungen! Um das Problem zu beheben und trotzdem==
die linke Seite zustring
. Wenn ich mich richtig erinnere, schlägt der Warntext genau das vor.2 Stimmen
@JeppeStigNielsen +1 für den Hinweis, Compiler-Warnungen zu lesen. Noch besser: Schalten Sie die Option "Warnungen als Fehler" ein, um jeden zu zwingen, sie zu beachten.
0 Stimmen
Dies liegt an der Gleichheit der Werte (Methode equal) und der referenziellen Gleichheit (Operator ==), da die Methode equal die Werte prüft, während der Operator == die Referenz prüft.