Problembehandlung bei Datentypen (Visual Basic)

Auf dieser Seite sind einige häufige Probleme aufgeführt, die auftreten können, wenn Sie Vorgänge auf systeminternen Datentypen ausführen.

Floating-Point Ausdrücke nicht gleich vergleichen

Wenn Sie mit Gleitkommanummern (Einzeldatentyp und Doppeldatentyp) arbeiten, denken Sie daran, dass sie als binäre Brüche gespeichert werden. Dies bedeutet, dass sie keine genaue Darstellung einer Menge halten können, die kein binärer Bruch (des Formulars k / (2 ^ n) ist, wobei k und n ganze Zahlen sind. Beispielsweise kann 0,5 (= 1/2) und 0,3125 (= 5/16) als genaue Werte gehalten werden, wobei 0,2 (= 1/5) und 0,3 (= 3/10) nur Näherungen sein können.

Aufgrund dieser Ungenauigkeit können Sie sich nicht auf genaue Ergebnisse verlassen, wenn Sie auf Gleitkommawerten arbeiten. Insbesondere zwei Werte, die theoretisch gleich sind, könnten etwas unterschiedliche Darstellungen haben.

So vergleichen Sie Gleitkommamengen
1. Berechnen Sie den absoluten Wert ihrer Differenz mithilfe Abs der Methode der Math Klasse im System Namespace.
2. Bestimmen Sie einen zulässigen maximalen Unterschied, sodass Sie die beiden Mengen für praktische Zwecke berücksichtigen können, wenn ihre Differenz nicht größer ist.
3. Vergleichen Sie den absoluten Wert des Unterschieds mit dem zulässigen Unterschied.

Im folgenden Beispiel wird sowohl ein falscher als auch richtiger Vergleich von zwei Double Werten veranschaulicht.

Dim oneThird As Double = 1.0 / 3.0
Dim pointThrees As Double = 0.333333333333333

' The following comparison does not indicate equality.
Dim exactlyEqual As Boolean = (oneThird = pointThrees)

' The following comparison indicates equality.
Dim closeEnough As Double = 0.000000000000001
Dim absoluteDifference As Double = Math.Abs(oneThird - pointThrees)
Dim practicallyEqual As Boolean = (absoluteDifference < closeEnough)

MsgBox("1.0 / 3.0 is represented as " & oneThird.ToString("G17") &
    vbCrLf & "0.333333333333333 is represented as " &
    pointThrees.ToString("G17") &
    vbCrLf & "Exact comparison generates " & CStr(exactlyEqual) &
    vbCrLf & "Acceptable difference comparison generates " &
    CStr(practicallyEqual))

Im vorherigen Beispiel wird die Methode der Double Struktur verwendet, damit sie eine bessere Genauigkeit angeben kann, als das ToStringCStr Schlüsselwort verwendet wird. Die Standardeinstellung ist 15 Ziffern, aber das Format "G17" erweitert sie auf 17 Ziffern.

Mod-Operator gibt kein genaues Ergebnis zurück.

Aufgrund der Ungenauigkeit des Gleitkommaspeichers kann der Mod-Operator ein unerwartetes Ergebnis zurückgeben, wenn mindestens eine der Operanden gleitenden Punkt ist.

Der Dezimaldatentyp verwendet keine Gleitkommadarstellung. Viele Zahlen, die ungenau Single sind und Double genau Decimal sind (z. B. 0,2 und 0,3). Obwohl Arithmetik langsamer als in Decimal Gleitkomma ist, lohnt es sich möglicherweise, die Leistung zu verringern, um eine bessere Genauigkeit zu erzielen.

So finden Sie die ganze Zahl der Gleitkommamengen
1. Deklarieren von Variablen als Decimal.
2. Verwenden Sie das Literaltypzeichen D , um Literale zu erzwingen Decimal, falls ihre Werte für den Long Datentyp zu groß sind.

Im folgenden Beispiel wird die potenzielle Ungenauigkeit von Gleitkommaopernden veranschaulicht.

Dim two As Double = 2.0
Dim zeroPointTwo As Double = 0.2
Dim quotient As Double = two / zeroPointTwo
Dim doubleRemainder As Double = two Mod zeroPointTwo

MsgBox("2.0 is represented as " & two.ToString("G17") &
    vbCrLf & "0.2 is represented as " & zeroPointTwo.ToString("G17") &
    vbCrLf & "2.0 / 0.2 generates " & quotient.ToString("G17") &
    vbCrLf & "2.0 Mod 0.2 generates " &
    doubleRemainder.ToString("G17"))

Dim decimalRemainder As Decimal = 2D Mod 0.2D
MsgBox("2.0D Mod 0.2D generates " & CStr(decimalRemainder))

Im vorherigen Beispiel wird die Methode der Double Struktur verwendet, damit sie eine bessere Genauigkeit angeben kann, als das ToStringCStr Schlüsselwort verwendet wird. Die Standardeinstellung ist 15 Ziffern, aber das Format "G17" erweitert sie auf 17 Ziffern.

DoubleDa zeroPointTwo es sich um einen Wert von 0,2 handelt, handelt es sich um einen unendlich wiederholten binären Bruch mit einem gespeicherten Wert von 0.2000000000000001. Teilung 2.0 durch diese Menge ergibt 9.999999999999999995 mit einem Rest von 0.199999999999999999911.

Im Ausdruck für decimalRemainder, das Literaltypzeichen D erzwingt beide Operanden zu Decimal, und 0,2 hat eine genaue Darstellung. Daher gibt der Mod Betreiber den erwarteten Rest von 0,0 ab.

Beachten Sie, dass es nicht ausreichend ist, als Decimaldeklariert zu werdendecimalRemainder. Sie müssen auch die Literale zu Decimalerzwingen, oder sie verwenden Double standardmäßig und decimalRemainder erhält den gleichen ungenauen Wert wie doubleRemainder.

Boolescher Typ konvertiert nicht genau in numerischen Typ

Boolesche Datentypwerte werden nicht als Zahlen gespeichert, und die gespeicherten Werte sollen nicht mit Zahlen übereinstimmen. Für die Kompatibilität mit früheren Versionen bietet Visual Basic Konvertierungswörter (CType-Funktion, CBool, CIntusw.) zum Konvertieren zwischen Boolean und numerischen Typen. Andere Sprachen führen diese Konvertierungen jedoch manchmal anders aus, wie die .NET Framework Methoden.

Sie sollten nie Code schreiben, der auf gleichwertigen numerischen Werten für True und False. Wenn möglich, sollten Sie die Verwendung von Boolean Variablen auf die logischen Werte beschränken, für die sie konzipiert sind. Wenn Sie kombinationen und numerische Werte kombinieren Boolean müssen, stellen Sie sicher, dass Sie die von Ihnen ausgewählte Konvertierungsmethode verstehen.

Konvertierung in Visual Basic

Wenn Sie die Schlüsselwörter oder Konvertierungsbegriffe CTypeCBool verwenden, um numerische Datentypen zu Booleankonvertieren, wird 0, False und alle anderen Werte werden True. Wenn Sie Werte in numerische Typen konvertieren, indem Sie Boolean die Konvertierungsstichwörter verwenden, False wird 0 und True wird zu -1.

Konvertierung im Framework

Die ToInt32 Methode der Convert Klasse im System Namespace konvertiert True in +1.

Wenn Sie einen Boolean Wert in einen numerischen Datentyp konvertieren müssen, achten Sie darauf, welche Konvertierungsmethode Sie verwenden.

Zeichen literal generiert Compilerfehler

Wenn keine Typzeichen vorhanden sind, wird Visual Basic davon ausgegangen, dass standardmäßige Datentypen für Literale verwendet werden. Der Standardtyp für ein Zeichen literal – eingeschlossen in Anführungszeichen (" ") – ist String.

Der String Datentyp wird nicht auf den Char-Datentyp erweitert. Dies bedeutet, dass Wenn Sie einer Char Variable eine Literal zuweisen möchten, müssen Sie entweder eine schmale Konvertierung vornehmen oder den Literal zum Char Typ erzwingen.

So erstellen Sie ein Char-Literal zum Zuweisen einer Variablen oder Konstanten
1. Deklarieren Sie die Variable oder Konstante als Char.
2. Schließen Sie den Zeichenwert in Anführungszeichen (" ") ein.
3. Folgen Sie dem schließenden doppelten Anführungszeichen mit dem Literaltypzeichen C , um das Literal zu Charerzwingen. Dies ist erforderlich, wenn der Typüberprüfungsschalter (Option Strict Statement) Onist, und es ist in jedem Fall wünschenswert.

Im folgenden Beispiel wird sowohl die erfolgreichen als auch die erfolgreichen Zuordnungen eines Literals zu einer Char Variablen veranschaulicht.

Dim charVar As Char
' The following statement attempts to convert a String literal to Char.
' Because Option Strict is On, it generates a compiler error.
charVar = "Z"
' The following statement succeeds because it specifies a Char literal.
charVar = "Z"c
' The following statement succeeds because it converts String to Char.
charVar = CChar("Z")

Es gibt immer ein Risiko bei der Verwendung von Schmalungskonvertierungen, da sie zur Laufzeit fehlschlagen können. Beispielsweise kann eine Konvertierung von String zu Char zu fehlschlagen, wenn der String Wert mehr als ein Zeichen enthält. Daher ist es besser, das C Typzeichen zu verwenden.

Fehler bei der Zeichenfolgenkonvertierung zur Laufzeit

Der Zeichenfolgendatentyp nimmt an sehr wenigen Erweiterungskonvertierungen teil. String erweitert sich nur auf sich selbst und Objectnur und CharChar() (ein Char Array) auf String. Dies liegt daran, dass String Variablen und Konstanten Werte enthalten können, die andere Datentypen nicht enthalten können.

Wenn der Typüberprüfungsschalter (Option Strict-Anweisung) lautet On, wird der Compiler alle impliziten Schmalungskonvertierungen nicht zulassen. Dies umfasst diejenigen, die sich beteiligen String. Ihr Code kann weiterhin Konvertierungswörter wie CStr z. B. und CType-Funktion verwenden, die die .NET Framework zum Versuch der Konvertierung leiten.

Hinweis

Der Verschränkungsfehler wird für Konvertierungen aus den Elementen in einer For Each…Next Auflistung in die Schleifensteuerelementvariable unterdrückt. Weitere Informationen und Beispiele finden Sie im Abschnitt "Schmale Konvertierungen" in For Each... Nächste Anweisung.

Eingeschränkter Konvertierungsschutz

Der Nachteil der Schmalungskonvertierungen besteht darin, dass sie zur Laufzeit fehlschlagen können. Wenn beispielsweise eine String Variable etwas anderes als "True" oder "False" enthält, kann sie nicht in Booleankonvertiert werden. Wenn sie Interpunktationszeichen enthält, schlägt die Konvertierung in einen numerischen Typ fehl. Es sei denn, Sie wissen, dass Ihre String Variable immer Werte enthält, die der Zieltyp akzeptieren kann, sollten Sie keine Konvertierung versuchen.

Wenn Sie von String einem anderen Datentyp konvertieren müssen, besteht die sicherste Prozedur darin, die versuchte Konvertierung in das Try einzuschließen... Fangen... Abschließende Anweisung. Dadurch können Sie mit einem Laufzeitfehler umgehen.

Zeichenarrays

Ein einzelnes Char Und ein Array von Char Elementen wird sowohl auf String. String Wird jedoch nicht auf Char()erweitert. Um einen Wert in ein StringChar Array zu konvertieren, können Sie die ToCharArray Methode der System.String Klasse verwenden.

Bedeutungslose Werte

Im Allgemeinen String sind Werte in anderen Datentypen nicht sinnvoll, und die Konvertierung ist sehr künstlich und gefährlich. Wenn möglich, sollten Sie die Verwendung von String Variablen auf die Zeichensequenzen beschränken, für die sie konzipiert sind. Sie sollten niemals Code schreiben, der auf gleichwertigen Werten in anderen Typen basiert.

Weitere Informationen