我在C#winforms应用程序中设置了一些默认颜色,如下所示:
readonly Color ERROR = Color.Red;
readonly Color WARNING = Color.Orange;
readonly Color OK = Color.Green;
据我所知,readonly基本上是我的目的。如果我尝试将它们定义为常量,编译器会指出它必须是编译时常量,而Color不是。
我很好地保留这些原样,或者是否有某种方法来定义我应该注意的这些常量?
(目的只是让一个位置可以更改所有颜色以进行记录。)
答案 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
。