Trabajar con literales Byte
-
13-09-2019 - |
Pregunta
Estoy usando la siguiente función para aclarar encima de los valores de color (es un lambda en mi código, pero eso no debería hacer una differende):
Function ReduceDistanceTo255(ByVal i As Byte) As Byte
Return i + (255 - i) \ 2
End Function
No se compilará, ya que el compilador interpreta 255
y 2
como enteros en lugar de bytes, por lo que el resultado del tipo Integer
. Por desgracia, no hay ningún tipo Byte carácter , así que no puedo acaba de escribir 255B
o algo por el estilo.
Existen algunas soluciones obvias al problema:
Function ReduceDistanceTo255(ByVal i As Byte) As Byte
Return i + (CByte(255) - i) \ CByte(2)
End Function
y
Function ReduceDistanceTo255(ByVal i As Byte) As Byte
Return CByte(i + (255 - i) \ 2)
End Function
y
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 primera de ellas es simplemente feo y difícil de leer, porque cada necesidades literales que se CByte
d. El segundo realiza cálculos en números enteros y luego convierte el resultado a byte, lo cual está bien, pero no tan elegante como una operación pura-Byte. La tercera solución no requiere CByte
s, pero sus inconvenientes son evidentes.
¿Me he perdido algo de (elegante) cuarta opción que me permite hacer Byte de sólo-matemáticas sin estorbar mi fórmula con CBools?
Solución
Se menciona específicamente en la Especificación del lenguaje Visual Basic, capítulo 2.4.2:
anotación > No es un tipo carácter de byte debido a que la mayoría carácter natural sería B, que es un carácter legal en un hexadecimal literal.
Bueno, eso es cierto, supongo. "Octeto" quedó rechazada también, sin duda. Uso de retorno CByte (...), es más barato que ToByte ().
Otros consejos
¿Cómo sobre el 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
ninguna conversión, sin bastidor, hay variables adicionales
¿Qué hay de la manera más fácil:
Imports System.Convert
Function ReduceDistanceTo255(ByVal i As Byte) As Byte
Return ToByte(i + (255 - i) \ 2)
End Function
Editar:. Yo prefiero esta solución porque sería hacer menos de fundición y es bastante claro para mí lo que está pasando