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

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top