Ist es bei diesem Vergleich wichtig, umzuwandeln? VS ist das anscheinend egal.

  • VB.NET
  • .NET (FX) 4.5–4.8

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

    Ist es bei diesem Vergleich wichtig, umzuwandeln? VS ist das anscheinend egal.

    Hallo zusammen, ganz kurze Frage. Ich habe hier folgenden Beispielcode:

    VB.NET-Quellcode

    1. Private Sub Button_DSL_Minus_Click(sender As Object, e As EventArgs) Handles Button_DSL_Minus.Click
    2. If Anzahl_DSL > CUShort(0) Then
    3. Anzahl_DSL -= CUShort(1)
    4. End If
    5. End Sub

    Die globale Variable Anzahl_DSL ist ein UShort. Das ist absichtlich so gemacht worden, weil man nur eine positive Anzahl an Verträgen haben kann. Außerdem sollten 65.535 ausreichen :D
    Eigentlich müsste ich nicht die 0 zu einem UShort machen. Wenn ich nur If Anzahl_DSL > 0 Then schreibe, wird int mit int verglichen. Wenn ich den Cast hinzufüge If Anzahl_DSL > CUShort(0) Then, dann wird UShort mit UShort verglichen. Die Umwandlung wird in Visual Studio nicht dunkelblau, also wird nicht als redundant angesehen. Andererseits meldet Visual Studio auch nicht, dass eine Umwandlung nötig sei. Ok, das wird wahrscheinlich damit zusammenhängen, dass, wenn int mit int verglichen wird, eh ein größerer Bereich abgedeckt ist, es also egal ist.

    Wie handhabt ihr das so? Ist es wichtig, so etwas abzudecken?

    Viele Grüße

    Bartosz

    Bilder
    • vergleicht int mit int.jpg

      56,55 kB, 1.447×194, 58 mal angesehen
    • vergleicht UShort mit UShort.jpg

      61,67 kB, 1.463×187, 59 mal angesehen
    Typumwandlung soweit als möglich immer vermeiden.
    Verwende den richtigen Datentyp:

    VB.NET-Quellcode

    1. If Anzahl_DSL > 0US Then Anzahl_DSL -= 1US

    Edit - Was hat die Frage mit "VergleichsOperator überladen" zu tun?
    Mir scheint, du hast einen falschen Begriff von was Operator-Überladung ist

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()

    @ErfinderDesRades Ok, hätte ich auch drauf kommen können, gleich 0US zu schreiben. Aber mir ging es eigentlich um die Sache, dass Visual Studio weder für das eine noch für das andere warnt. Egal, mit dem richtigen Datentyp ist das dann OK.

    Ja, ich habe das gegoogelt, wie das heißt, wenn einmal A mit A verglichen wird und B mit B. Und schon findet man das Stichwort Operator überladen. :whistling:

    Bartosz schrieb:

    Aber mir ging es eigentlich um die Sache, dass Visual Studio weder für das eine noch für das andere warnt.
    Ich weiss nu nicht, was du da jetzt mit das eine und das andere genau meinst.
    Den > - Operator?, den - - Operator? die Typumwandlung? das weglassen der Typumwandlung?
    Worüber genau wunderst du dich, dass eine Warnung von VS ausbleibt (und wes Inhalts sollte die Warnung sein)?

    Bartosz schrieb:

    Ja, ich habe das gegoogelt, wie das heißt, wenn einmal A mit A verglichen wird und B mit B. Und schon findet man das Stichwort Operator überladen.
    Also bei mir heisst das Vergleich, wenn A mit A verglichen wird und B mit B.
    Theoretisch könnte man auch den Vergleich von A und B implementieren, mit einem überladenen Operator.

    Hat aber auch nix mit deim Thread-Titel zu tun, ob es wichtig sei, den Vergleichs-Operator zu überladen.
    Das klingt ja so, als könntest du den VergleichsOperator von Integer oder UShort überladen.
    Kannst du natürlich nicht, du kannst ja nicht die Sources der Integer-Struktur ändern.
    Wenn du einen Operator überladen willst, dann musst du erstmal eine eigene Klasse schreiben.
    Und für diese Klasse einen Operator.
    Dann(!) kannste diesen Operator auch überladen.
    D.h. einen weiteren Operator implementieren, für dasselbe Token, aber mit einem anderen Datentyp als zweiten Operand.

    Bartosz schrieb:

    mit dem richtigen Datentyp ist das dann OK.
    Das Studio warnt genau dann, wenn es keine Default-Konvertierung gibt.
    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!
    Also bei mir heisst das Vergleich, wenn A mit A verglichen wird und B mit B
    Ja, bei mir auch, ich habe da etwas Falsches aufgeschnappt. Vergiss das mit überladen. Ich werde den Thread-Titel ändern.

    Edit, ich erklär's nochmal anders: Anzahl_DSL ist ein UShort. Beim Vergleich wird dieser UShort Anzahl_DSL (nur für diesen Vergleich) zu einem Integer. Es wird Integer mit Integer verglichen.
    Zwar für die Zahl 0, von daher ist es eh egal, aber was solls. Es wird de facto Integer mit Integer verglichen. Wie Rod sagte, es wird der nächstgrößere Typ draus! Visual Studio warnt nicht, "Mach da nen UShort draus!". Wenn ich andererseits die Umwandlung hinzufüge, wird korrekterweise UShort mit UShort verglichen.
    Hier wird allerdings nicht gesagt, dass die Umwandlung redundant sei. Die müsste ja doppelt redundant sein. 1.) Weil der Integer-Bereich eh größer ist als der UShort-Zahlenbereich. 2.) Weil es hier um die 0 (null) geht! Ich kenne VS eigentlich so, dass entweder für das eine oder für das andere gewarnt wird. Und das ist die Frage, die ich gestern Abend schnell mal in die Runde werfen wollte :D

    Das Studio warnt genau dann, wenn es keine Default-Konvertierung gibt.
    Also nur dann, wenn der Compiler gar nicht weiß, was welche Typen er vergleichen soll? Ok, danke.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Bartosz“ ()

    Bartosz schrieb:

    Integer mit Integer vergleicht (weil 0 ein Integer ist).
    Er konvertiert auf den gemeinsamen "übergeordneten Typ":
    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!
    Jo, bei UShort und 0 gibts also drei Möglichkeiten (und bei keiner dieser Möglichkeiten hat der Compiler Einwände)

    'Dim Anzahl_DSL As UShort
    1. If Anzahl_DSL > 0 : implizite Konvertierung (widening Cast) von Anzahl_DSL auf den umfassenderen Typ Integer -> Integer-Vergleich
    2. If Anzahl_DSL > CType(0, UShort): explizite Konvertierung von 0 auf den "engeren" Typ UShort -> UShort-Vergleich
    3. If Anzahl_DSL > 0US: statt Konvertierung Verwendung von UShort-0 -> UShort-Vergleich
    2) trägt ein Risiko, wenn statt 0 mit was annerem verglichen werden sollte - vielleicht steht da ja eine Variable, oder ein Ausdruck, der zB -1 ergibt.