在 C# 中将颜色定义为常量
Posted
技术标签:
【中文标题】在 C# 中将颜色定义为常量【英文标题】:Defining colors as constants in 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 不是。
我是否可以将这些保持原样,或者有什么方法可以定义这些我应该注意的常量?
(目的只是为了有一个位置来更改所有颜色以进行日志记录。)
【问题讨论】:
【参考方案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
确实意味着“恒定” - 就像一个永远不会改变的值,例如 pi 或 e。这就是为什么在编译时替换它们是安全的,因为名称代表一个永远不变的值。
你说的事实......
目的只是为了有一个单一的位置来更改所有颜色以进行日志记录。
...表示这些在语义上不是恒定的,因此不应定义为const
,即使可以这样做。
【讨论】:
你提出了一个很好的观点。在理论上他们不会改变,除非管理层说“嘿,红色在日志窗口中太难阅读了。”【参考方案3】:只有文字可以定义为const
。不同之处在于,const
值硬烘焙到使用它的程序集中。如果它们的定义发生变化,那么调用站点不会注意到它们,除非它们被重新编译。
相比之下,readonly
以一种在 构造函数 (或 static readonly
变量的情况下为静态构造函数)之外无法重新分配变量的方式声明变量。
所以,你没有其他方法可以在这里使用 readonly,因为 Color 是一个结构,没有原始数据类型或文字。
【讨论】:
这非常重要,我想说它支持readonly static
是const
的首选方式的想法。【参考方案4】:
这很好,你不能做得更好(正如编译器告诉你的那样)。
但如果还没有,请务必将它们设为static
。
【讨论】:
【参考方案5】:const
字段是 compile time
常量 - 您实际上需要运行代码来确定 Color.Orange
的值,但内部可能定义为
public static readonly Color Orange = new Color(...);
由于无法在编译时计算,您唯一的选择是在运行时设置的readonly
。
还可以查看this article。
【讨论】:
【参考方案6】:您至少可以将它们设为静态。只读 field 只是一个只能在初始化期间分配的字段。它不保证表示的值是“只读的”。
【讨论】:
以上是关于在 C# 中将颜色定义为常量的主要内容,如果未能解决你的问题,请参考以下文章
想要在 Windows 应用程序中将自定义的 Datetimepicker 显示为“仅月份和年份”(使用 C#)