为什么颜色在字节上使用 Int32

本文关键字:Int32 字节 颜色 为什么 | 更新日期: 2023-09-27 18:34:56

使用这个例子:

Color.FromArgb(

Int32, Int32, Int32(

从指定的 8 位颜色值(红色、绿色和蓝色(。alpha 值隐式为 255(完全不透明(。尽管此方法允许为每种颜色传递 32 位值组件,每个组件的值限制为 8 位。

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

在更广泛的范围内,我发现人们非常普遍地使用Int32,即使Int16Byte就足够了。使用Int32超过Int16Byte等有什么特别的原因吗?

为什么颜色在字节上使用 Int32

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

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

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

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


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

既然有人建议这样可以节省向下抛弃:我不明白这一点。扩大整数转换是隐式的,没有有意义的性能成本(通常没有(。

我认为

没有充分的理由。首先,我认为深入研究代码会提供一些见解,但我所能找到的只是有一些检查来确保 alpharedgreenblue 的值在 [0..255] 范围内,否则会引发异常。在内部,然后调用 MakeArgb 方法,该方法确实使用 byte

/// <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));
    }
}

我想它在早期只是变成了这样(我们在这里谈论的是 .NET 1.0(,然后它就卡住了。

此外,还有FromArgb(int)重载,它允许您使用一个 32 位值设置所有 32 位。奇怪的是,这是一个int而不是unsigned int.

Color结构本身对 R、G、B 和 A 组件使用 byte 类型。

我认为他们选择使用 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表示后忘记规范化组件?