Вопрос

Я использую следующую функцию для повышения яркости значений цвета (в моем коде это лямбда-символ, но это не должно иметь значения):

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

Первый из них просто уродлив и труден для чтения, потому что каждый буквальный должен быть CByted.Второй выполняет вычисления в целых числах, а затем преобразует результат в байт, что нормально, но не так элегантно, как операция с чистым байтом.Третий обходной путь не требует CBytes, но его недостатки очевидны.

Я пропустил какой-то (элегантный) четвертый вариант, который позволяет мне выполнять математику только в байтах, не загромождая мою формулу 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

Редактировать: Я бы предпочел этот обходной путь, потому что он будет выполнять меньше кастинга, и мне довольно ясно, что происходит.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top