Работа с байтовыми литералами - PullRequest
1 голос
/ 07 декабря 2009

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

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 с, но его недостатки очевидны.

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

Ответы [ 3 ]

4 голосов
/ 07 декабря 2009

Это специально упоминается в спецификации языка Visual Basic, глава 2.4.2:

Примечание > Типа нет символ для байта, потому что наиболее естественный характер будет B, который юридический символ в шестнадцатеричном буквальным.

Ну, это правда, я думаю. Без сомнения, за «Октет» тоже проголосовали. Используйте Return CByte (...), это дешевле, чем ToByte ().

1 голос
/ 05 августа 2011

Как насчет использования констант:

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 голосов
/ 07 декабря 2009

Как насчет простого пути:

Imports System.Convert

Function ReduceDistanceTo255(ByVal i As Byte) As Byte
    Return ToByte(i + (255 - i) \ 2)
End Function

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...