如何快速避免Byte值超出0-255范围的错误(无需大量If语句)
如何快速避免Byte值超出0-255范围的错误(无需大量If语句)
嘿,我懂你遇到的麻烦——用Select Case判断颜色值范围时,一旦ref减去3、6这类数变成负数,或者加上后超过255,就会触发Byte类型的范围错误,总不能写一堆If去挨个判断每个边界对吧?
这里有几个简洁的办法,不用写大量分支就能搞定:
方法一:用Math.Clamp限制区间边界(推荐)
核心思路是先把ref转成Integer(避免Byte运算溢出),然后用Math.Clamp把每个区间的上下限牢牢锁在0-255范围内,这样Case的范围永远合法。
代码示例:
Dim col As Color ' 要检查的颜色 Dim ref As Byte ' 期望的颜色值 ' 先把Byte类型的ref转成Integer,防止减法溢出报错 Dim refInt As Integer = ref ' 计算每个区间的合法上下限,超出0或255的直接被修正 Dim range1Min As Integer = Math.Clamp(refInt - 3, 0, 255) Dim range1Max As Integer = Math.Clamp(refInt + 3, 0, 255) Dim range2Min As Integer = Math.Clamp(refInt - 6, 0, 255) Dim range2Max As Integer = Math.Clamp(refInt + 6, 0, 255) Dim range3Min As Integer = Math.Clamp(refInt - 10, 0, 255) Dim range3Max As Integer = Math.Clamp(refInt + 10, 0, 255) Select Case col.R Case ref ' 完全匹配时执行的代码 Case range1Min To range1Max ' 与ref相差±3范围内的代码 Case range2Min To range2Max ' 与ref相差±6范围内的代码 Case range3Min To range3Max ' 与ref相差±10范围内的代码 Case Else ' 超出所有范围的代码 End Select
举个例子:如果ref是0,refInt -3会是-3,Math.Clamp直接把它修正为0,对应的Case就变成0 To 3;如果ref是255,refInt +3变成258,会被修正为255,Case就变成252 To 255,完全符合预期。
方法二:内嵌Clamp函数,让代码更紧凑
如果你不想额外定义变量,也可以直接在Case语句里写Clamp逻辑,虽然可读性稍差一点,但代码更简洁:
Dim col As Color ' 要检查的颜色 Dim ref As Byte ' 期望的颜色值 Dim refInt As Integer = ref Select Case col.R Case ref ' 完全匹配时执行的代码 Case Math.Clamp(refInt - 3, 0, 255) To Math.Clamp(refInt + 3, 0, 255) ' 与ref相差±3范围内的代码 Case Math.Clamp(refInt - 6, 0, 255) To Math.Clamp(refInt + 6, 0, 255) ' 与ref相差±6范围内的代码 Case Math.Clamp(refInt - 10, 0, 255) To Math.Clamp(refInt + 10, 0, 255) ' 与ref相差±10范围内的代码 Case Else ' 超出所有范围的代码 End Select
兼容旧版本VB的小技巧
如果你的VB版本不支持Math.Clamp(比如VB6),可以自己写一个极简的Clamp函数:
Private Function Clamp(value As Integer, min As Integer, max As Integer) As Integer If value < min Then Return min If value > max Then Return max Return value End Function
然后把代码里的Math.Clamp换成这个自定义函数就行,效果完全一样。
备注:内容来源于stack exchange,提问作者ezio
相关产品推荐
相关产品推荐

