为什么Windows窗体设计器将int转换为byte然后返回int以用于FromArgb?

时间:2012-01-31 02:11:06

标签: c# winforms colors designer

我今天正在查看一些代码并看到如下内容:

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

当我问为什么会这样时,由于Resharper确认所有的演员阵容都是多余的,我被告知设计师这样做了,他们已经复制了。

我看了一下,确定Designer在将属性设置为自定义颜色时生成与上面相同的代码。

有谁知道设计师为什么会这样做?除非我遗漏了什么,否则它看起来似乎没有意义?

2 个答案:

答案 0 :(得分:9)

此代码由Winforms设计器中内置的代码序列化程序自动生成。这里的有罪方是System.Drawing.ColorConverter类,TypeConverter for 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属性返回一个字节。因此,代码序列化程序首先生成整数文字并应用(byte)强制转换以匹配参数类型。然后看到FromArgb()接受整数参数,所以应用(int)强制转换。

这只是疯狂机器生成的代码。它必须是正确的,它不一定非常漂亮。

答案 1 :(得分:5)

没有任何好处。它只是让代码难以阅读。

这是优选的

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

甚至是alpha通道版本:

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

正如@Alexei Levenkov指出的那样,也许作者是谨慎的,但鉴于该方法的明确名称及其(众所周知的)预期用途,为什么有人会使用大于255的值来获取任何参数?

参考。 Color.FromArgb Method