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

¿Fue útil?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top