【问题标题】:How Does System.Drawing.Color Struct Initialize Colors?System.Drawing.Color Struct 如何初始化颜色?
【发布时间】:2011-04-20 03:48:41
【问题描述】:

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

经过一番研究,我想我想采用与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; }
// ...

谁能向我解释静态颜色值(与包含结构相同的类型)是如何被初始化的?我一定是错过了什么。

【问题讨论】:

  • 我认为他们不会公开每一个实现细节。在任何情况下,我的第一个猜测是每个静态属性只返回一个带有适当 ARGB 值的new Color(...)
  • 我明白了。所以你说他们没有被初始化。相反,它们是在请求时生成的。如果是这样,这种方法听起来并不像我最初想的那样干净。
  • 假设 Color 是可变的(我实际上没有使用过),你每次都想要它的新实例,不是吗?
  • @Jonathan Wood:这些是静态属性,它们只被初始化一次,而不是在请求时
  • @Jonathan Wood @BrokenGlass:是的,记住结构是值类型。

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


【解决方案1】:

如果你用 Reflector 查看 Color 类,你会看到:

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

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

【讨论】:

  • +1 用于购买反射器,所以我不必这样做。又一天……又省了一美元。
  • @xixonia:当Reflector 在你得到“你想更新”对话框时强制你更新(并且没有其他工作)显然得到了最后一个免费版本 - 刚刚尝试过它阅读此主题后工作:red-gate.com/messageboard/viewtopic.php?t=13238
  • @BrokenGlass,当我使用 pre-pay4it 版本的计算机时,我将不得不尝试这个。我在这里下载有点晚了:/
  • 好吧,现在我不确定接受一个参数的Color 构造函数在哪里(我没看到),但这似乎可以回答原始问题。
  • @Jonathan - 它被标记为内部,所以你不能使用那个:internal Color(KnownColor knownColor); - 但你可以使用Color.FromKnownColor()
【解决方案2】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2010-12-15
    • 1970-01-01
    • 2015-04-08
    • 2015-11-08
    • 1970-01-01
    • 1970-01-01
    • 2017-07-21
    • 2021-03-19
    • 2011-07-29
    相关资源
    最近更新 更多