2009-12-07 27 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