System.Drawing.Color Struct如何初始化颜色?

时间:2011-04-20 03:48:41

标签: c# .net system.drawing.color

我需要创建一个包含一些方法和一长串常量的类型。

经过一番研究后,我想我想采用System.Drawing.Color结构采用的相同方法。但是,查看此结构的源(从元数据生成)给出了类似以下内容。

public byte A { get; }
public static Color AliceBlue { get; }
public static Color AntiqueWhite { get; }
public static Color Aqua { get; }
public static Color Aquamarine { get; }
public static Color Azure { get; }
public byte B { get; }
// ...

有人可以向我解释静态Color值(与包含结构的类型相同)是如何初始化的?我一定错过了什么。

2 个答案:

答案 0 :(得分:4)

如果您使用Reflector查看Color课程,您会看到:

public static Color AliceBlue
{
    get
    {
        return new Color(KnownColor.AliceBlue);
    }
}

确认每次都返回一个新的Color对象。

答案 1 :(得分:2)

使用.NET Reflector(下面的派生代码),我们可以看到每次调用静态Color属性(例如:AliceBlue)时都会创建一个新的颜色结构。 Microsoft可能以这种方式实现它以确保此属性的不可变值。

public static Color AliceBlue
{
    get
    {
        return new Color(KnownColor.AliceBlue);
    }
}

调用内部构造函数并将枚举值(KnownColor.AliceBlue)传递给contstructor。 Color结构存储此枚举并设置它是已知颜色的标志/状态。

internal Color(KnownColor knownColor)
{
    this.value = 0L;
    this.state = StateKnownColorValid;
    this.name = null;
    this.knownColor = (short) knownColor;
}

此外,通过分析.NET Reflector代码,当您尝试从Color结构中获取值(例如R属性)时,该属性会在查找表上进行搜索(即私有静态数组)使用knownColor枚举并返回表示所有颜色信息的Int64。从那里开始,它会进行一些位操作(按位AND,位移等),以得出代表R(或GB等)值的字节。< / p>