Работа с байтовыми литералами
-
13-09-2019 - |
Вопрос
Я использую следующую функцию для повышения яркости значений цвета (в моем коде это лямбда-символ, но это не должно иметь значения):
Function ReduceDistanceTo255(ByVal i As Byte) As Byte
Return i + (255 - i) \ 2
End Function
Он не будет компилироваться, так как компилятор интерпретирует 255
и 2
в виде целых чисел, а не байтов, что делает результат типа Integer
.К сожалению, там нет символа байтового типа, поэтому я не могу просто написать 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.Второй выполняет вычисления в целых числах, а затем преобразует результат в байт, что нормально, но не так элегантно, как операция с чистым байтом.Третий обходной путь не требует CByte
s, но его недостатки очевидны.
Я пропустил какой-то (элегантный) четвертый вариант, который позволяет мне выполнять математику только в байтах, не загромождая мою формулу CBools?
Решение
Это специально упомянуто в спецификации языка Visual Basic, глава 2.4.2:
Аннотация > Не существует типа символ для Byte, потому что наиболее естественным символом был бы B, который является допустимым символом в шестнадцатеричном формате литералом.
Что ж, думаю, это правда."Октет", без сомнения, тоже был отвергнут.Используйте Return CByte(...), это дешевле, чем ToByte().
Другие советы
Как насчет использования констант:
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
никакого преобразования, никакого приведения, никаких дополнительных переменных
Как насчет простого способа:
Imports System.Convert
Function ReduceDistanceTo255(ByVal i As Byte) As Byte
Return ToByte(i + (255 - i) \ 2)
End Function
Редактировать: Я бы предпочел этот обходной путь, потому что он будет выполнять меньше кастинга, и мне довольно ясно, что происходит.