Aus irgendeinem Grund erlaubt C # keine Verwendung des ==-Operators in generischen Klassen wie hier:
%Vor%Wenn ich == durch val.Equals (Wert) ersetze, habe ich Code, der wie erwartet funktioniert, aber wenn ich auf Bytecode schaue, sieht es viel komplizierter aus. Ein sehr einfacher Test, bei dem int-Variablen in der Schleife mit == und Equals () verglichen wurden, zeigte, dass die Version Equals () zweimal langsamer als die Version "==" war.
Ich frage mich, ob es eine Möglichkeit gibt, primitive Werttypen in generischen Klassen zu vergleichen, die so schnell wie == operator sind. Irgendwelche Ideen willkommen.
Bearbeiten: Ich habe mich zwischen den Timern verlaufen. Der Leistungsunterschied ist nicht so dramatisch. Hier sind meine neuesten Ergebnisse:
%Vor%Kurz gesagt: Equals () ist gut genug.
Der Grund dafür ist, dass ==
standardmäßig auf die Referenzgleichheit eingestellt ist und dies für Werttypen keinen Sinn ergibt. Die Antwort lautet immer false
. Da es keinen Sprachmechanismus gibt, generische Typen basierend auf statischen Methoden einzuschränken, lässt der Compiler dies einfach zu, da nicht überprüft werden kann, ob T
wirklich einen überladenen ==
Operator hat.
Wenn Sie andererseits T
auf class
beschränken, wird es gut kompiliert, weil die Referenzgleichheit für Referenztypen sinnvoll ist.
Die Lösung ist natürlich IEquatable<T>
; In jeder vernünftig implementierten Struktur gibt IEquatable<T>.Equals(T t)
Ihnen eine Gleichheitssemantik und ==
sollte sich konsistent verhalten.
Und beantworten Sie Ihre Frage, nein gibt es nicht. Wenn Sie wirklich die Geschwindigkeit von int == int
benötigen, müssen Sie eine nicht generische spezialisierte Klasse implementieren.
Tags und Links c# generics performance operators