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

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top