Trabalhar com Bytes literais
-
13-09-2019 - |
Pergunta
Eu estou usando a seguinte função para iluminar valores de cor (é um lambda no meu código, mas que não deveria fazer uma differende):
Function ReduceDistanceTo255(ByVal i As Byte) As Byte
Return i + (255 - i) \ 2
End Function
Ele não vai compilar, desde que o compilador interpreta 255
e 2
como inteiros em vez de bytes, fazendo com que o resultado do tipo Integer
.Infelizmente, não há nenhum tipo Byte caracteres, então não posso escrever apenas 255B
ou algo parecido.
Há alguns óbvio soluções alternativas para o 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
A primeira é simplesmente feio e difícil de ler, porque todos literal precisa ser CByte
d.O segundo realiza cálculos em números inteiros, e, em seguida, converte o resultado para Byte, que é OK, mas não é elegante como um puro-Byte operação.A terceira solução não requer CByte
s, mas é desvantagens são evidentes.
Fez eu perder alguns (elegante) quarta opção, que me permite fazer Byte-apenas-matemática sem bagunçar a minha fórmula com CBools?
Solução
É mencionado especificamente na especificação do Visual Basic Language, capítulo 2.4.2:
Anotação > Não há um personagem do tipo para byte, porque o caráter mais natural seria B, que é um caráter legal em um literal hexadecimal.
Bem, isso é verdade, eu acho. "Octete" também foi votado, sem dúvida. Use Return cbyte (...), é mais barato que Tobyte ().
Outras dicas
Como sobre o uso de 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
sem conversão, sem elenco, sem acréscimo de variáveis
Que tal da maneira mais fácil:
Imports System.Convert
Function ReduceDistanceTo255(ByVal i As Byte) As Byte
Return ToByte(i + (255 - i) \ 2)
End Function
Editar: Eu preferiria essa solução alternativa porque faria menos elenco e é bem claro para mim o que está acontecendo.