在C#中将颜色定义为常量

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

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

据我所知,readonly基本上是我的目的。 如果我尝试将它们定义为常量,编译器会指示它必须是编译时常量,而Color不是。

我很好地保留这些原样,还是有一些方法来定义我应该注意的这些常量?

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

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

相反, readonly以一种方式声明一个变量,它在构造函数之外不能被重新赋值(或者在static readonly变量的情况下是静态构造函数)。

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

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

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

由于无法在编译时计算,因此您唯一的选项是readonly ,它是在运行时设置的。

另请查看这篇文章 。

你至少可以让它们变得静止。 只读字段只是一个字段,只能在启动期间分配给该字段。 它不保证所表示的值是“只读”。

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

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

你陈述的事实……

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

…表示它们在语义上不是常量,因此即使可以这样做也不应该定义为const

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

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

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

但是,如果它们还没有,那么它们是否是static