Arbeiten mit Byte -Literalen
-
13-09-2019 - |
Frage
Ich verwende die folgende Funktion, um die Farbwerte aufzuhellen (es ist eine Lambda in meinem Code, aber das sollte kein Unterschied machen):
Function ReduceDistanceTo255(ByVal i As Byte) As Byte
Return i + (255 - i) \ 2
End Function
Es wird nicht kompiliert, da der Compiler interpretiert 255
und 2
eher als Ganzzahlen als als Bytes, um das Ergebnis des Typs zu machen Integer
. Leider, Es gibt keinen Byte -Typ -Zeichen, Also kann ich nicht einfach schreiben 255B
oder sowas ähnliches.
Das Problem gibt einige offensichtliche Problemumgehungen:
Function ReduceDistanceTo255(ByVal i As Byte) As Byte
Return i + (CByte(255) - i) \ CByte(2)
End Function
und
Function ReduceDistanceTo255(ByVal i As Byte) As Byte
Return CByte(i + (255 - i) \ 2)
End Function
und
Function ReduceDistanceTo255(ByVal i As Byte) As Byte
Dim FF As Byte = 255
Dim two As Byte = 2
Return i + (FF - i) \ two
End Function
Der erste ist einfach hässlich und schwer zu lesen, weil jeder wörtlich muss sein CByte
d. Der zweite führt Berechnungen in Ganzzahlen durch und wandelt dann das Ergebnis in Byte um, was in Ordnung ist, aber nicht so elegant wie eine reine Byte-Operation. Die dritte Problemumgehung erfordert nicht CByte
S, aber es sind Nachteile offensichtlich.
Habe ich eine (elegante) vierte Option vermisst, mit der ich nur Byte-Mathematik durchführen kann, ohne meine Formel mit CBools zu überfüllen?
Lösung
Es wird ausdrücklich in der visuellen Grundsprachenspezifikation in Kapitel 2.4.2 erwähnt:
Anmerkung > Es gibt keinen Typ Charakter für Byte, da der natürlichste Charakter B wäre, was ein legaler Charakter in einem hexadezimalen Literal ist.
Nun, das ist wahr, denke ich. "Oktett" wurde auch ohne Zweifel abgestimmt. Verwenden Sie Return CByte (...), es ist billiger als Tobyte ().
Andere Tipps
Wie wäre es mit Konstanten:
Function ReduceDistanceTo255(ByVal i As Byte) As Byte
Const bFF As Byte = 255
Const b02 As Byte = 2
Return i + (bFF - i) \ b02
End Function
Keine Konvertierung, kein Casting, keine zusätzlichen Variablen
Wie wäre es mit dem einfachen Weg:
Imports System.Convert
Function ReduceDistanceTo255(ByVal i As Byte) As Byte
Return ToByte(i + (255 - i) \ 2)
End Function
Bearbeiten: Ich würde diese Problemumgehung bevorzugen, weil es weniger Casting tun würde und es mir ziemlich klar ist, was los ist.