2009-12-07 25 views
1

我使用下面的函數來照亮顏色值的工作(這是在我的代碼拉姆達,但不應該有differende):與字節文字

Function ReduceDistanceTo255(ByVal i As Byte) As Byte 
    Return i + (255 - i) \ 2 
End Function 

它不會編譯,因爲編譯器將2552解釋爲整數而不是字節,從而產生Integer類型的結果。不幸的是,there is no Byte type character,所以我不能只寫255B或類似的東西。

有幾個明顯的解決方法的問題:

Function ReduceDistanceTo255(ByVal i As Byte) As Byte 
    Return i + (CByte(255) - i) \ CByte(2) 
End Function 

Function ReduceDistanceTo255(ByVal i As Byte) As Byte 
    Return CByte(i + (255 - i) \ 2) 
End Function 

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 

第一個就是難看,難以閱讀,因爲文字需要是CByte d。第二個以整數執行計算,然後將結果轉換爲Byte,這是正常的,但不像純字節操作那樣優雅。第三種解決方法不需要CByte s,但它的缺點是顯而易見的。

我是否錯過了一些(優雅的)第四個選項,它允許我在沒有將公式與CBool​​s混淆的情況下進行Byte-only-math?

+1

我不是一個VB的傢伙,所以我不會在這坐裂的答案。但是,聽起來你已經覆蓋了所有的基地。你沒有提到的唯一的事情就是讓它具有所有的整數,並讓調用者擔心轉換爲字節。 – falstro 2009-12-07 12:32:01

+0

我不認爲有更清晰的方法。我會用第二。這只是一個演員,所以我不明白什麼是大問題。 – Samuel 2009-12-07 12:34:33

回答

4

這是在Visual Basic語言規範特別提到,章2.4.2:

註釋 >沒有爲字節因爲最 自然特性將是一個類型 字符B,這是 一個合法的字符,十六進制的 文字。

嗯,這是真的我猜。毫無疑問,「Octet」也被拒絕了。使用Return CByte(...),它比ToByte()便宜。

+0

感謝您挖掘文檔;至少我現在知道*爲什麼*沒有字節類型的字符。 – Heinzi 2009-12-07 14:03:03

0

如何最簡單的方法:

Imports System.Convert 

Function ReduceDistanceTo255(ByVal i As Byte) As Byte 
    Return ToByte(i + (255 - i) \ 2) 
End Function 

編輯:我喜歡這個解決辦法,因爲它會少做鑄造,這是非常清楚,我這是怎麼回事。

+0

那有什麼不同?除了「ToByte」而不是「CByte」? – falstro 2009-12-07 12:37:45

+0

Ahhhh ...對不起,我錯過了那個... – Bobby 2009-12-07 12:46:01

1

如何使用常量:

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 

沒有轉換,無鑄造,沒有多餘的變量

+0

+1,對選項3絕對是一個不錯的改進。 – Heinzi 2011-08-05 05:59:23