我正在使用以下函数来增亮颜色值(在我的代码中它是一个lambda,但这不应该有区别):
Function ReduceDistanceTo255(ByVal i As Byte) As Byte
Return i + (255 - i) \ 2
End Function
它不会编译,因为编译器将255
和2
解释为整数而不是字节,从而生成类型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
,但它的缺点很明显。
我是否错过了一些(优雅的)第四选项,它允许我在不使用CBools混乱我的公式的情况下进行Byte-only-math?
答案 0 :(得分:4)
在Visual Basic语言规范第2.4.2节中具体提到:
<强>注释强> &GT;没有类型 Byte的字符因为最多 自然特征是B,也就是 十六进制的合法字符 文字。
嗯,我猜是的。毫无疑问,“Octet”也被投了票。使用Return CByte(...),它比ToByte()便宜。
答案 1 :(得分: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
没有转换,没有转换,没有额外的变量
答案 2 :(得分:0)
简单方法怎么样:
Imports System.Convert
Function ReduceDistanceTo255(ByVal i As Byte) As Byte
Return ToByte(i + (255 - i) \ 2)
End Function
编辑:我更喜欢这种解决方法,因为它会减少投射,我很清楚发生了什么。