为什么Color使用Int32 over Byte?

时间:2016-02-17 14:32:03

标签: c# .net types

使用此示例:

Color.FromArgb(Int32, Int32, Int32)

  

根据指定的8位颜色值创建Color结构(红色,   绿色和蓝色)。 alpha值隐式为255(完全不透明)。   虽然此方法允许为每种颜色传递32位值   组件,每个组件的值限制为8位。

如果每个组件的值限制为8位,那么为什么他们不使用Byte而不是Int32

在更广泛的范围内,我发现人们使用Int32非常普遍,即使Int16Byte就足够了。是否有任何特殊原因通常Int32 Int16Byte等?

3 个答案:

答案 0 :(得分:5)

我的猜测是某些.NET语言不太支持这个字节。也许它不符合CLS,我不记得了。这些天不再关心CLS合规性,但在1.0天内,这是一个重要的功能级别。另请注意,VB.NET不支持unsigned类型,这是跨.NET语言对整数的不同支持的一个示例。

使用int构造函数特别奇怪,因为A, R, G, B属性为byte

我认为这是一个API设计错误。

Color结构通常不是特别漂亮。它不仅具有ARGB值,还具有KnownColor和名称。许多问题都被塞进了这个结构中。为了好玩,Equals方法有一个bugreturn name.Equals(name);。当然,这总是如此。这个结构看起来很仓促。您可以从Equals方法告诉代码作者不知道字符串有重载的相等运算符。等于Color的运算符等于刚刚复制的15行。我想这个问题的真正答案是:实习生做到了!

通常Int32是首选,因为大多数算术运算扩展到32位,并且它是普通硬件的有效整数宽度。较短的整数类型用于更特殊的用途。

因为有人建议这样可以节省预测:我不明白这一点。扩展整数转换是隐式的,没有有意义的性能成本(通常没有)。

答案 1 :(得分:1)

我认为没有充分的理由。首先,我认为深入挖掘代码可以提供一些见解,但我能找到的是,有一些检查可以确保alpharedgreen和{{ 1}}在[0..255]范围内,如果不是则抛出异常。在内部,然后调用blue方法, 使用MakeArgb

byte

我想它在早期就已成为那种方式(我们在这里谈论.NET 1.0)然后它就卡住了。

此外, /// <summary> /// [...] /// Although this method allows a 32-bit value /// to be passed for each component, the value of each /// component is limited to 8 bits. /// </summary> public static Color FromArgb(int alpha, int red, int green, int blue) { Color.CheckByte(alpha, "alpha"); Color.CheckByte(red, "red"); Color.CheckByte(green, "green"); Color.CheckByte(blue, "blue"); return new Color(Color.MakeArgb((byte)alpha, (byte)red, (byte)green, (byte)blue), Color.StateARGBValueValid, null, (KnownColor)0); } private static long MakeArgb(byte alpha, byte red, byte green, byte blue) { return (long)((ulong)((int)red << 16 | (int)green << 8 | (int)blue | (int)alpha << 24) & (ulong)-1); } private static void CheckByte(int value, string name) { if (value < 0 || value > 255) { throw new ArgumentException(SR.GetString("InvalidEx2BoundArgument", name, value, 0, 255)); } } 重载,它允许您将所有32位设置为一个32位值。奇怪的是,这是FromArgb(int)而不是int

答案 2 :(得分:0)

Color结构本身使用byte类型作为R,G,B和A组件。

我认为他们已经选择使用int作为参数类型,即使byte就足够了,因为它会在转换ARGB表示形式时保存用户免于转换为类型顾名思义,Color结构的颜色。这将完成:

int argb = 0xffff0000; // Red
Color red = Color.FromArgb((argb & 0xff000000) >> 24, (argb & 0x00ff0000) >> 16, (argb & 0x0000ff00) >> 8, argb & 0x000000ff);

让编码器手动将每个字符强制转换为一个字节会使该行延长"(byte)()".Length * 4 = 32个字符。

另外,当值大于255或小于0时​​,他们可以提出ArgumentException 正确通知用户他们已经输入错误的输入,而不是仅仅夹紧值。也许他们在使用更高精度的Color表示后会忘记规范化组件?