1 votes

Travailler avec des littéraux d'octets

J'utilise la fonction suivante pour éclaircir les valeurs de couleur (c'est un lambda dans mon code, mais cela ne devrait pas faire de différence) :

Function ReduceDistanceTo255(ByVal i As Byte) As Byte
    Return i + (255 - i) \ 2
End Function

Il ne sera pas compilé, car le compilateur interprète 255 y 2 en tant qu'entiers plutôt qu'en tant qu'octets, ce qui fait que le résultat est de type Integer . Malheureusement, il n'y a pas de caractère de type octet Je ne peux donc pas me contenter d'écrire 255B ou quelque chose comme ça.

Il existe quelques solutions évidentes à ce 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

La première est tout simplement laide et difficile à lire, parce que tous littérale doit être CByte d. Le second effectue des calculs sur des entiers et convertit ensuite le résultat en octet, ce qui est correct, mais pas aussi élégant qu'une opération sur un octet pur. La troisième solution ne nécessite pas de CByte mais ses inconvénients sont évidents.

Ai-je manqué une quatrième option (élégante) qui me permette de faire du calcul sur octets sans encombrer ma formule avec des CBools ?

4voto

Hans Passant Points 475940

Il est spécifiquement mentionné dans la spécification du langage Visual Basic, chapitre 2.4.2 :

Annotation > pour l'octet car le caractère le plus naturel un caractère légal dans un littéral littéral hexadécimal.

C'est vrai, je suppose. "Octet" a également été rejeté, sans aucun doute. Utilisez Return CByte(...), c'est moins cher que ToByte().

1voto

Norm Points 11

Pourquoi ne pas utiliser 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 de moulage, pas de variables supplémentaires

0voto

Bobby Points 6894

Pourquoi ne pas opter pour la solution la plus simple ?

Imports System.Convert

Function ReduceDistanceTo255(ByVal i As Byte) As Byte
    Return ToByte(i + (255 - i) \ 2)
End Function

Editer : Je préférerais cette solution de contournement parce qu'il y a moins d'erreurs de casting et que ce qui se passe est assez clair pour moi.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X