【问题标题】:Defining colors as constants in C#在 C# 中将颜色定义为常量
【发布时间】:2011-07-19 21:32:45
【问题描述】:

我在 C# winforms 应用程序中设置了一些默认颜色,如下所示:

readonly Color ERROR = Color.Red;
readonly Color WARNING = Color.Orange;
readonly Color OK = Color.Green;

据我所知,对于我的目的而言,readonly 本质上是一个常量。如果我尝试将这些定义为常量,编译器会指出它必须是编译时常量,而 Color 不是。

我是否可以将这些保持原样,或者有什么方法可以定义这些我应该注意的常量?

(目的只是为了有一个位置来更改所有颜色以进行日志记录。)

【问题讨论】:

    标签: c# colors compile-time-constant


    【解决方案1】:

    您可以像这样定义静态颜色:

    // tested with C# 5.0
    static const Color ERROR = Color.FromArgb(0, 255,0);
    static const Color MYPOOL = Color.FromKnownColor(KnownColor.Aqua);
    

    【讨论】:

    • 这不会编译,因为 Color 不是编译时常量。
    【解决方案2】:

    除了其他人提到的技术方面(const 值在编译时在它们使用的地方被替换,并且必须是文字而不是在运行时分配和引用的 static readonly 值) 有一个语义问题需要考虑。

    const 值在编译时被替换的原因是 const 确实意味着“恒定” - 就像一个永远不会改变的值,例如 pie。这就是为什么在编译时替换它们是安全的,因为名称代表一个永远不变的值。

    你说的事实......

    目的只是为了有一个单一的位置来更改所有颜色以进行日志记录。

    ...表示这些在语义上不是恒定的,因此不应定义为const,即使可以这样做。

    【讨论】:

    • 你提出了一个很好的观点。在理论上他们不会改变,除非管理层说“嘿,红色在日志窗口中太难阅读了。”
    【解决方案3】:

    只有文字可以定义为const。不同之处在于,const硬烘焙到使用它的程序集中。如果它们的定义发生变化,那么调用站点不会注意到它们,除非它们被重新编译。

    相比之下,readonly 以一种在 构造函数 (或 static readonly 变量的情况下为静态构造函数)之外无法重新分配变量的方式声明变量。

    所以,你没有其他方法可以在这里使用 readonly,因为 Color 是一个结构,没有原始数据类型或文字。

    【讨论】:

    • 这非常重要,我想说它支持readonly staticconst 的首选方式的想法。
    【解决方案4】:

    这很好,你不能做得更好(正如编译器告诉你的那样)。

    但如果还没有,请务必将它们设为static

    【讨论】:

      【解决方案5】:

      const 字段是 compile time 常量 - 您实际上需要运行代码来确定 Color.Orange 的值,但内部可能定义为

      public static readonly Color Orange = new Color(...);
      

      由于无法在编译时计算,您唯一的选择是在运行时设置的readonly

      还可以查看this article

      【讨论】:

        【解决方案6】:

        您至少可以将它们设为静态。只读 field 只是一个只能在初始化期间分配的字段。它不保证表示的值是“只读的”。

        【讨论】:

          猜你喜欢
          • 2010-12-24
          • 2012-01-08
          • 1970-01-01
          • 2017-07-03
          • 1970-01-01
          • 2023-04-02
          • 1970-01-01
          相关资源
          最近更新 更多