使用此示例:
Color.FromArgb(Int32, Int32, Int32)
根据指定的8位颜色值创建Color结构(红色, 绿色和蓝色)。 alpha值隐式为255(完全不透明)。 虽然此方法允许为每种颜色传递32位值 组件,每个组件的值限制为8位。
如果每个组件的值限制为8位,那么为什么他们不使用Byte
而不是Int32
?
在更广泛的范围内,我发现人们使用Int32
非常普遍,即使Int16
或Byte
就足够了。是否有任何特殊原因通常Int32
{> Int16
,Byte
等?
答案 0 :(得分:5)
我的猜测是某些.NET语言不太支持这个字节。也许它不符合CLS,我不记得了。这些天不再关心CLS合规性,但在1.0天内,这是一个重要的功能级别。另请注意,VB.NET不支持unsigned类型,这是跨.NET语言对整数的不同支持的一个示例。
使用int
构造函数特别奇怪,因为A, R, G, B
属性为byte
。
我认为这是一个API设计错误。
Color
结构通常不是特别漂亮。它不仅具有ARGB值,还具有KnownColor
和名称。许多问题都被塞进了这个结构中。为了好玩,Equals
方法有一个bug:return name.Equals(name);
。当然,这总是如此。这个结构看起来很仓促。您可以从Equals
方法告诉代码作者不知道字符串有重载的相等运算符。等于Color
的运算符等于刚刚复制的15行。我想这个问题的真正答案是:实习生做到了!
通常,Int32
是首选,因为大多数算术运算扩展到32位,并且它是普通硬件的有效整数宽度。较短的整数类型用于更特殊的用途。
因为有人建议这样可以节省预测:我不明白这一点。扩展整数转换是隐式的,没有有意义的性能成本(通常没有)。
答案 1 :(得分:1)
我认为没有充分的理由。首先,我认为深入挖掘代码可以提供一些见解,但我能找到的是,有一些检查可以确保alpha
,red
,green
和{{ 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
表示后会忘记规范化组件?