Probleme mit überladenem operator ==



  • Wenn zwei Objekte gleich sind, aber die ID nicht

    Wie soll das denn gehen? Wann sind denn jetzt die Objekte gleich? Bei gleicher Referenz haben sie doch auch die gleiche Id. Und dann KANN sie ja gar nciht unterschiedlich sein. Wenn es zwei unterschiedliche Objekte sind (also andere Referenzen) und die Id unterschiedlich, dann sind es die beiden Objekte auch und man bekommt false zurück

    Kommt drauf an, was du für deine ArrayList willst: Ob kein Elemente doppelt drin sind, oder ob überhaupt keine logisch gleichen Elemente mehrmals drin sind. Das zweite ist natürlich aufwändig, aber es geht halt nicht anders.

    Das ist es, was ich will. Keine logisch gleichen Elemente (wsa sich primär an der Id festmacht).

    Deshalb sollte man mit Equals() auch immer die Methode um einen Hashcode zu getten (weiss grad nicht wie die heisst), redefinieren.

    Habe ich gemacht. Heißt übrigens treffender Weise GetHashCode() 😉 Aber so sagst Du ja plötzlich wieder, dass man Equals überschreiben soll, um die Id zu vergeleichen.

    Was ich sowieso überhaupt schwachsinnig finde, weil da vergleiche ich gleich lieber die Referenzen.

    Wie gesagt, kommen die Daten aus einem Xml-File. Da kann ich ja schlecht Referenzen reinschreiben. Daher brauche ich eine eindeutige Variable, die ich prima als Attribut / Childnode angeben kann. Als Klartext. Dieser wird dann geparst. Wenn ich die Materials erzeugt habe, anschließend wer weiß was mache und dann plötzlich aus dem Xml-File auf ein solches Material verweise, brauche ich die Id. Sonst geht es nicht.

    Aber was ist der == Operator?? Auf Ebene von object prüft er (wie Equal()) die Referenzen -- was auch sonst -- und damit auf Identität.
    Nein, Equals soll nicht die Referenzen vergleichen. Das macht natürlich

    Sorry, so habe ich es nicht gemeint. Mir ist klar, dass Equals die inhaltliche Gleichheit prüfen soll. Ich meinte, dass object keine andere Wahl hat, als die Referenzen zu nehmen. Statt "wie Equal()" müsste es heißen "wie im Falle von object auch Equal()", ok?

    Aber ich bin zu dre Überzeugung gekommen, dass ich die Methoden / Operatoren NICHT überschreibe. Ich teste, ob sich ein Material mit der gleichen Id in der Liste befindet. Wenn ja => return Referenz, else return null, was zu einer Exeption führt, da das Xml-File falsch war.



  • Wie soll das denn gehen? Wann sind denn jetzt die Objekte gleich? Bei gleicher Referenz haben sie doch auch die gleiche Id. Und dann KANN sie ja gar nciht unterschiedlich sein. Wenn es zwei unterschiedliche Objekte sind (also andere Referenzen) und die Id unterschiedlich, dann sind es die beiden Objekte auch und man bekommt false zurück

    Ich kann auch zwei Baugleiche Autos mit unterschiedlicher Seriennummer (ID) haben. Wenn du den Unterschied zwischen Gleichheit und Identität nicht verstehst, hat das keinen Sinn.
    Eine unterschiedliche ID ist doch keine Garantie dafür, dass zwei Objekte nicht gleichwertig sind.

    Das ist es, was ich will. Keine logisch gleichen Elemente (wsa sich primär an der Id festmacht).

    Ne, macht es sich nicht. Du kannst zwei gleiche Materialien haben, jeweils mit unterschiedlicher ID. Du verstehst den Begriff "logische Gleichheit" nicht richtig.

    Habe ich gemacht. Heißt übrigens treffender Weise GetHashCode() Aber so sagst Du ja plötzlich wieder, dass man Equals überschreiben soll, um die Id zu vergeleichen.

    Nein, das war an Andreas gerichtet und ich habe damit gesagt, dass man Equals verwenden soll um logische Gleichheit festzustellen und nicht die IDs/Referenzen zu vergleichen. GetHashcode() kann das beschleunigen, weil Objekte mit unterschiedlichem Hashcode nicht mehr mit Equals verglichen werden müssen.

    Es ist ja ok, wenn du nur die IDs vergleichen willst, aber dann benutze nicht Equals dafür, sondern z.B. RefEquals.
    Aber mach einfach, wie du für richtig hältst, ich denke, es ist alles gesagt.



  • Hi,

    ich will mich ja wirklich nicht streiten. Ich fand es eigentlich ne gute Diskussion. Ich habe leider die Id auf meinen Fall bezogen. Ich gebe Dir absolut Recht, dass beim Auto zwei IDs verschieden sein können, aber sie ansonsten baugleich sind. Sorry, ich war wirklcih auf meine CollisionMaterials fixiert. Und dort ist es wirklcih eine eineindeutige Erkennung.

    Und, wie gesagt, ich habe den Code wieder rausgeschmissen und vergleiche nicht mit Equal und auch nicht mit ==, sondern einfach mat1.Id == mat2.Id. Einverstanden?? 🙄



  • Hi,

    ich wollte nochmal auf folgenden Thread ("überladen von Vergleichs Operatoren") im Csharp Forum hinweisen. Die Antwort von VizOne ist sehr ausführlich und weist auf nette Methoden von object hin, wie ReferenceEquals()



  • Auf die hab ich auch hingewiesen. 😉


Anmelden zum Antworten