18

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

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

据我所知,对于我的目的而言, readonly 本质上是一个常数。如果我试图将这些定义为常量,编译器会指出它必须是编译时常量,而 Color 不是。

我是否可以将这些保持原样,或者有什么方法可以定义我应该注意的这些常量?

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

4

6 回答 6

24

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

相反,以在构造函数(或变量的情况下为静态构造函数)readonly之外无法重新分配变量的方式声明变量。static readonly

因此,您没有其他方法可以在这里使用 readonly,因为 Color 是一个结构,并且没有原始数据类型或文字。

于 2011-03-21T18:12:54.493 回答
5

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

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

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

另请查看这篇文章

于 2011-03-21T18:11:59.267 回答
2

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

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

你说的事实...

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

...表示这些在语义上不是恒定的,因此不应定义为const即使可以这样做。

于 2011-03-21T18:20:23.233 回答
1

你至少可以让它们成为静态的。否则,只读字段就是只能在初始化期间分配的字段。它不保证表示的值是“只读的”。

于 2011-03-21T18:11:48.980 回答
0

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

但是static,如果他们还没有,请务必制作它们。

于 2011-03-21T18:12:20.507 回答
-1

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

// tested with C# 5.0
static const Color ERROR = Color.FromArgb(0, 255,0);
static const Color MYPOOL = Color.FromKnownColor(KnownColor.Aqua);
于 2014-10-14T15:43:45.857 回答