PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : .NET: string vergleichen mit '==' und 'Equals()'


Elemental
2007-05-24, 09:30:34
Hallo zusammen,
ich hab gerade ein kleines Problem beim Vergleich von strings.
Zuallerst mal hab ich gemerkt, dass ein string in .NET kein value type ist, wie ich bisher angenommen habe:
http://www.yoda.arachsys.com/csharp/strings.html

Dort heisst es aber:

When the == operator is used to compare two strings, the Equals method is called, which checks for the equality of the contents of the strings rather than the references themselves.


Nun zu einem kleinen Code-Beispiel:

string a = new string(new char[]{'a', 'b', 'c'});
string b = new string(new char[] { 'a', 'b', 'c' });

bool bEqual1 = (a == b);
bool bEqual2 = (a.Equals(b));

object c = a;
object d = b;

bool bEqual3 = (c == d);
bool bEqual4 = (c.Equals(d));


bEqual1 ist true
bEqual2 ist true
bEqual3 ist false
bEqual4 ist true


Warum ist bEqual3 false?
Die Methode Equals() ist virtual.
Aber wie ist das mit dem überladenen "==" operator beim string?
Wird hier der "==" operator von object verwendet anstatt der von string?

mfG
Bernd

HellHorse
2007-05-24, 09:39:10
Die Methode Equals() ist virtual.
Ja schon, aber Operatoren nicht.

Elemental
2007-05-24, 09:44:56
OK, hab ich gerade auch mit "Go to definition" beim string rausgefunden. Die Klasse string hat 2 Operatoren:

public static bool operator !=(string a, string b);
public static bool operator ==(string a, string b);


Aber die Klasse object hat überhaupt keine Operatoren! Wieso kann ich dann "==" verwenden?

SgtTynis
2007-05-24, 10:00:23
Aber die Klasse object hat überhaupt keine Operatoren! Wieso kann ich dann "==" verwenden?

In dem Fall wird die Standardsprachdefinition verwendet, und die vergleicht mittels "==" die Referenz.

Elemental
2007-05-24, 10:06:02
OK, nun die wichtigste Frage:
Warum sind Operatoren in .NET nicht virtual?

HellHorse
2007-05-24, 12:43:24
OK, nun die wichtigste Frage:
Warum sind Operatoren in .NET nicht virtual?
Weil sie static sind. Warum sind sie static (warum sind class extensions in C# 3.0 static)? Wenn ich flamen wollte würde ich sagen, weil Microsoft OOP nicht versteht. Sicher wird gleich jemand Performance Vorteile anführen, aber es gab schon vor 10 Jahren VMs die eine monomorphische virtuelle Methode zu den Kosten einer nicht-virtuellen Methode ausführen konnten. Das einzige, was mir einfällt ist wenn der linke Operand null ist.

http://blogs.msdn.com/ericlippert/archive/2007/05/14/why-are-overloaded-operators-always-static-in-c.aspx
Hat nicht wirklich Sinn gemacht für mich.

Gnafoo
2007-05-24, 16:59:29
Gute Frage. Folgendes habe ich gerade mit Google gefunden mir gedacht, es schadet nicht das hier einzuwerfen:
http://www.codeproject.com/csharp/cssimpolymorph.asp

Die Kommentare ganz unten (unter "Why not?") sind auch ganz interessant.

Bietchiebatchie
2007-06-05, 17:33:23
Hmm bin ich der einzige, der das Verhalten gut findet?
string sind ja nur notgedrungen ein reference type, von der semantik her auf jeden fall ein value type. Oder sieht jemand einen Sinn darin zu fragen, ob das eine "foo" das selbe ist wie das andere "foo"; genausowenig wie das bei 1.0 einen Sinn macht, bei einem referenzierbaren Objekt hingegen schon.
Desweiteren: aus dem von HellHorse genanntem Grund bitte keine== operatoren überladen.