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

Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top