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 CByted. 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 CByteS, 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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top