Lavorare con letterali Byte
-
13-09-2019 - |
Domanda
Sto usando la seguente funzione per illuminare i valori di colore (è una lambda nel mio codice, ma che non dovrebbe fare una differende):
Function ReduceDistanceTo255(ByVal i As Byte) As Byte
Return i + (255 - i) \ 2
End Function
Non verrà compilato, dal momento che il compilatore interpreta 255
e 2
come interi piuttosto che byte, rendendo il risultato di tipo Integer
. Purtroppo, non v'è alcun tipo di carattere Byte , quindi non posso solo scrivere 255B
o qualcosa del genere.
Ci sono alcune soluzioni ovvie al problema:
Function ReduceDistanceTo255(ByVal i As Byte) As Byte
Return i + (CByte(255) - i) \ CByte(2)
End Function
e
Function ReduceDistanceTo255(ByVal i As Byte) As Byte
Return CByte(i + (255 - i) \ 2)
End Function
e
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
Il primo è semplicemente brutto e difficile da leggere, perché ogni esigenze letterali da CByte
d. Il secondo esegue i calcoli in numeri interi e quindi converte il risultato al byte, che è OK, ma non elegante come un'operazione puro byte. La terza soluzione non richiede CByte
s, ma è inconvenienti sono evidenti.
Mi sono perso un po 'di (elegante) quarta opzione che mi permette di fare Byte-solo-math senza ingombrare la mia formula con CBools?
Soluzione
E 'specificamente menzionato nel Visual Basic Language Specification, capitolo 2.4.2:
annotazione > Ci non è un tipo di carattere per Byte perché la più carattere naturale sarebbe B, che è un personaggio legale in un esadecimale letterale.
Beh, questo è vero credo. "Ottetto" ottenuto bocciato troppo, senza dubbio. Usa Return CByte (...), è più conveniente che ToByte ().
Altri suggerimenti
Come sull'utilizzo costanti:
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
nessuna conversione, nessuna fusione, senza variabili aggiuntive
Come circa il modo più semplice:
Imports System.Convert
Function ReduceDistanceTo255(ByVal i As Byte) As Byte
Return ToByte(i + (255 - i) \ 2)
End Function
Modifica:. preferisco questa soluzione perché sarebbe fare a meno di fusione ed è abbastanza chiaro per me quello che sta succedendo