Equals oder =

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Equals oder =

    Moin,

    als Beispiel:

    VB.NET-Quellcode

    1. Dim Result = MatchTest(1, 1)
    2. MessageBox.Show("Ergebnis: " & Result)
    3. Public Function MatchTest(value1 As Integer, value2 As Short) As Boolean
    4. Return value1.Equals(value2)
    5. 'Oder
    6. Return value1 = value2
    7. End Function


    Mit Equals gibt die Funktion False zurück, wenn die zu vergleichenden Werte zwar identisch sind, aber die Datentypen nicht übereinstimmen.
    Mit = gibt die Funktion immer True zurück, unabhängig davon, wie Integer und Short zusammenpassen.

    Die Funktionsweise von Equals und = sind mir daher, denke ich, bekannt.

    Ich selber nutze Equals in letzter Zeit gerne, da so Fehler bei nicht identischen Datentypen ersichtlicher werden und auch, weil man das Equals im Code oft schneller findet, als ein =.

    Sollte wirklich mal ein Integer mit einem Short über Equals verglichen werden, so caste ich den Short ...

    VB.NET-Quellcode

    1. Return value1.Equals(Convert.ToInt32(value2))


    Nun stellt sich mir die Frage, nutzt ihr Equals und wenn ja, warum und wenn nein, warum nicht?
    Gibt es noch weitere Probleme oder Unterschiede, auf die man bei Equals achten müsste?

    Grüße :)

    BlueLagoonX schrieb:

    Mit Equals gibt die Funktion False zurück, wenn die zu vergleichenden Werte zwar identisch sind, aber die Datentypen nicht übereinstimmen.

    Allein Dein Beispielcode liefert True zurück, obwohl das Equals-Ergebnis zurückgegeben wird.

    Wenn Wert2 ohne Konvertierung(sprobleme) in den Typ von Wert1 umgewandelt werden kann und die Werte gleich sind, kommt True zurück. Wenn Konvertierungswertverluste auftreten könnten (z.B. Long in Int), dann wird laut MSDN eine andere Equals-Überladung aufgerufen, die 2 Objects auf Identität der Instanzen, nicht der Werte, vergleicht. Und da kommt immer False raus.
    Bilder
    • Einspruch.png

      5 kB, 586×108, 45 mal angesehen
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „VaporiZed“ ()

    Ich nutze für ganzzahlige Werte = für den Abgleich. Equals benutze ich tatsächlich selten. Es ist umständlicher zu schreiben und bietet mir persönlich keine Vorteile die ich zu wertschätzen wüsste. Für Double und Single habe ich eine Extension geschrieben in der eine IsSimilar Funktion integriert ist. Die gibt beispielsweise bei einem Abgleich auch true zurück wenn man 5 mit 4,999...9 vergleicht, weil es hier aufgrund der binären Bruchrechnung im .NET häufig Ungenauigkeiten gibt und zwei Werte die mathemtisch gesehen gleich sind, trotzdem bei einem Equals-Abgleich false zurückliefern.

    @VaporiZed Ich habe auch gedacht, dass Konvertierungswertverluste der Grund sind, aber:

    value1.Equals(value2) liefert True
    value2.Equals(value1) liefert False
    Integer.Equals(value1, value2) liefert False ?!?

    Hast du eine Ahnung woran das liegen könnte?
    Bilder
    • IntShortAbgleich.PNG

      13,76 kB, 732×278, 48 mal angesehen


    Ein Computer wird das tun, was du programmierst - nicht das, was du willst.
    Weil Integer.Equals(P1, P2) die Überladung mit je Typ Object für P1 und P2 aufruft (s. IntelliSense). Und dann wird wieder der Instanz-Identitätscheck gemacht.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Jo, die Frage war dezent dümmlich. Danke! Und ich habe gedacht, wenn es ein Datentyp Problem wäre, dann sei der Code aufgrund Option Strict On nicht länger kompilierfähig, da der Abgleich ja explizit auf Integer lautet. Einen Object-Abgleich hab ich an der Stelle nicht erwartet, sorry.


    Ein Computer wird das tun, was du programmierst - nicht das, was du willst.
    @BlueLagoonX Variablen von Wert-Typen (int, dounle, DateTime, ...) kannst Du mit = vergleichen.
    Variablen von Verweis-Typen kannst Du mit Equals() vergleichen.
    Wenn Du Verweis-Typen auf Gleichheit von Membern vergleichen willst, musst Du die Vergleichsoperatoren überschreiben.
    docs.microsoft.com/de-de/dotne…types-and-reference-types
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!