Почему конструктор Windows Forms переводит int в байты, а затем обратно в int для FromArgb? - PullRequest
5 голосов
/ 31 января 2012

Сегодня я просматривал какой-то код и увидел что-то вроде следующего:

var colour = Color.FromArgb(((int)(((byte)(227)))), ((int)(((byte)(213)))), ((int)(((byte)(193)))));

Когда я спросил, почему это так, поскольку Решарпер подтвердил, что все приведения являются избыточными, мне сказали, что Дизайнер сделал это таким образом, и они скопировали это.

Я посмотрел и, конечно же, при создании свойства для пользовательского цвета конструктор генерирует код, аналогичный приведенному выше.

Кто-нибудь знает, почему Дизайнер сделал это? Кажется, это не имеет смысла, разве я что-то упускаю?

Ответы [ 2 ]

9 голосов
/ 31 января 2012

Этот код автоматически генерируется сериализатором кода, встроенным в конструктор Winforms. Виновной стороной здесь является класс System.Drawing.ColorConverter, TypeConverter для Color. Соответствующий код в его методе ConvertTo ():

   member = typeof(Color).GetMethod("FromArgb", new Type[] { typeof(int), typeof(int), typeof(int) });
   arguments = new object[] { color2.R, color2.G, color2.B };

Свойства R, G и B возвращают байт. Таким образом, сериализатор кода сначала генерирует целочисленный литерал и применяет приведение (байт) к типу аргументов. Затем видит, что FromArgb () принимает целочисленные аргументы, поэтому применяет приведение (int).

Это просто маниакальный машинный код. Это только должно быть правильно, это не должно быть красиво.

5 голосов
/ 31 января 2012

Там нет никакой выгоды. Все, что он делает, это делает код трудным для чтения.

Это предпочтительнее

var colour = Color.FromArgb(227, 213, 193);

или даже версия альфа-канала:

var colour = Color.FromArgb(255, 227, 213, 193);

Как отмечает @ Алексей Левенков, возможно, автор проявлял осторожность, но, учитывая четкое название метода и его (хорошо известное) предполагаемое использование, почему кто-либо использовал бы значение больше 255 для любого из параметров?

Ref. Метод Color.FromArgb

...