Travailler avec Byte littéraux
-
13-09-2019 - |
Question
J'utilise la fonction suivante pour égayer les valeurs de couleur (il est un lambda dans mon code, mais cela ne devrait pas faire une differende):
Function ReduceDistanceTo255(ByVal i As Byte) As Byte
Return i + (255 - i) \ 2
End Function
Il ne compile pas, puisque le compilateur interprète 255
et 2
comme des entiers plutôt que octets, ce qui rend le résultat du type Integer
. Malheureusement, il n'y a pas de caractère de type octet , je ne peux pas simplement écrire 255B
ou quelque chose comme ça.
Il y a quelques solutions de contournement évidentes au problème:
Function ReduceDistanceTo255(ByVal i As Byte) As Byte
Return i + (CByte(255) - i) \ CByte(2)
End Function
et
Function ReduceDistanceTo255(ByVal i As Byte) As Byte
Return CByte(i + (255 - i) \ 2)
End Function
et
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
Le premier est tout simplement laid et difficile à lire, parce que tous besoins littérales à CByte
d. Le deuxième effectue des calculs en nombres entiers et convertit ensuite le résultat de l'octet, qui est correct, mais pas aussi élégant que une opération pur octets. La troisième solution ne nécessite pas CByte
s, mais les inconvénients de celui-ci sont évidents.
Ai-je manqué un peu (élégant) quatrième option qui me permet de faire Byte-only-mathématiques sans encombrer ma formule avec CBools?
La solution
Il est spécifiquement mentionné dans le langage Visual Basic Spécification, chapitre 2.4.2:
Annotation > Il n'y a pas un type caractère pour Byte parce que le plus caractère naturel serait B, ce qui est un caractère juridique en hexadécimal littéral.
Eh bien, c'est vrai que je suppose. « Octuor » se est rejeté aussi, sans aucun doute. Utilisation Retour CByte (...), il est moins cher que ToByte ().
Autres conseils
Comment l'utilisation des constantes:
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
pas de conversion, pas coulée, pas de variables supplémentaires
Que diriez-vous de la manière simple:
Imports System.Convert
Function ReduceDistanceTo255(ByVal i As Byte) As Byte
Return ToByte(i + (255 - i) \ 2)
End Function
Edit:. Je préfère cette solution de contournement, car il ferait moins coulée et il est assez clair pour moi ce qui se passe