【问题标题】:Why does the Windows Forms Designer cast int to byte then back to int for FromArgb?为什么 Windows 窗体设计器将 int 转换为字节,然后再将 FromArgb 转换回 int?
【发布时间】:2012-01-31 02:11:06
【问题描述】:

我今天浏览了一些代码,看到如下内容:

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

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

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

有谁知道设计师为什么要这样做?从表面上看似乎没有意义,除非我遗漏了什么?

【问题讨论】:

  • 你可能错过了这里的快乐故事。只要机器写出这样的代码,你就能保住你的工作一段时间。

标签: c# winforms colors designer


【解决方案1】:

此代码由 Winforms 设计器中内置的代码序列化程序自动生成。这里的罪魁祸首是 System.Drawing.ColorConverter 类,即 Color 的 TypeConverter。其 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) 强制转换。

这只是疯狂的机器生成代码。它只需要正确,不必漂亮。

【讨论】:

  • 这就是我所追求的,解释为什么设计师首先会生成这样的代码。
【解决方案2】:

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

这样比较好

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

甚至是 alpha 通道版本:

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

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

参考。 Color.FromArgb Method

【讨论】:

  • +1。第一次转换为字节可用于截断值(如果值不是常量),但我看不出第二次转换的任何原因。
  • 您似乎认为这段代码是人类编写的。不是,Winforms 设计器代码是由机器编写的。它只需要编译,漂亮不是必需的。
  • @Hans:当我读到“我被告知设计师是这样做的”这个问题时,这听起来像是“一个”设计师,而不是“那个”设计师!我知道 Winforms 设计器是什么。
  • 在我问这个问题之前,我已经把代码改成了这个,也和程序员谈过。我很惊讶在粘贴这段代码后,他并没有停下来认为这可能不是最好的做法。不过,我可能对这个问题还不够清楚......
猜你喜欢
  • 2016-03-18
  • 2013-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多