在 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 确实意味着“恒定” - 就像一个永远不会改变的值,例如 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 只是一个只能在初始化期间分配的字段。它不保证表示的值是“只读的”。

【讨论】:

以上是关于在 C# 中将颜色定义为常量的主要内容,如果未能解决你的问题,请参考以下文章

如何在 CSS 中将颜色定义为变量?

如何在c#中将XML转换为自定义对象[重复]

想要在 Windows 应用程序中将自定义的 Datetimepicker 显示为“仅月份和年份”(使用 C#)

在 C# 中将字符串转换为画笔/画笔颜色名称

在Android中将任何颜色代码转换为最接近的人类颜色[重复]

C# 定义常量 两种实现方法