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.
\== Operator-Überschreibungscode, der innerhalb der String-Klasse auf https://referencesource.microsoft.com/
so jetzt ist es einfacher zu verstehen, die gleiche Methode hat auch 2 Implementierungen eine von der String-Klasse selbst und eine von der Objektklasse. seine Auswirkungen auf die Leistung als auch ich auch einige grundlegende Code ausführen und versuchen, die Benchmarks zu verstehen.
Ich teile die Ergebnisse unten Bitte korrigieren oder beraten, wenn ich irgendwo falsch bin. es gibt 3 Fälle, und ich habe den gleichen Code für alle Fälle ausgeführt und dies ist das Ergebnis.
Fall 1: Hier verwende ich die Methode string. equal für den Vergleich von 2 Strings und beide Strings haben die gleichen Werte. string.equals(a,b)
1. Durchlauf:5608195 Ticks
2. Durchlauf:5529387 Ticks
3. Lauf:5622569 Ticks
Zecken insgesamt: 16760151
Fall 2: Hier verwende ich die Methode string. equal() (überladen) zum Vergleichen von 2 Strings und beide Strings haben die gleichen Werte. a.equals(b)
1. Lauf: 6738583 Zecken
2. Lauf: 6452927 Zecken
3. Lauf: 7168897 Zecken
Ticks insgesamt=20360407
Fall 3: Hier verwende ich den == Operator für den Vergleich von 2 Strings und beide Strings haben die gleichen Werte. a==b
1. Lauf: 6652151 Zecken
2. Lauf: 7514300 Ticks
3. Lauf: 7634606 Zecken
Zecken insgesamt=21801057
class Program
{
private static int count;
static string a = "abcdef";
static string b = "abcdef";
static void Main(string[] args)
{
for (int j = 1; j <= 3; j++)
{
Stopwatch sw = new Stopwatch();
sw.Start();
for (int i = 1; i <= 1000; i++)
{
checkString();
}
sw.Stop();
Console.WriteLine(sw.ElapsedTicks);
}
Console.ReadLine();
}
public static void checkString()
{
for (int i = 1; i <= 100000; i++)
{
if (a==b)
count++;
}
}
}
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.