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

时间:2011-03-21 18:08:25

标签: c# colors compile-time-constant

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

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

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

我很好地保留这些原样,或者是否有某种方法来定义我应该注意的这些常量?

(目的只是让一个位置可以更改所有颜色以进行记录。)

6 个答案:

答案 0 :(得分:22)

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

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

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

答案 1 :(得分:4)

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

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

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

另请查看this article

答案 2 :(得分:2)

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

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

答案 3 :(得分:1)

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

答案 4 :(得分:1)

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

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

你陈述的事实......

  

目的只是让一个位置可以更改所有颜色以进行记录。

...表示这些不是语义上的常量,因此即使可以这样做,也不应该被定义为const

答案 5 :(得分:0)

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

但如果他们还没有,请确定static