我需要创建一个包含一些方法和一长串常量的类型。
经过一番研究后,我想我想采用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值(与包含结构的类型相同)是如何初始化的?我一定错过了什么。
答案 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
(或G
或B
等)值的字节。< / p>