如果您不能或不想使用其他答案中的静态构造函数(例如,因为在实际初始化变量之前您有很多与类型有关的事情,或者因为您意识到静态构造函数是一个真正的痛苦调试..)你可以做其他事情:
一种编译时解决方案是将您自己类型中的变量打包为非静态只读,并持有对该类型的静态引用
public class Constants
{
public readonly int MIN;
public Constants() { MIN = 18; }
}
public class Foo
{
public static Constants GlobalConstants { get; private set; }
public static void Main()
{
// do lots of stuff
GlobalConstants = new GlobalConstants();
}
}
或者你可以将常量变成一个属性,只为你班级之外的任何人提供 getter。请注意,声明类仍然可以更改属性。
public class Foo
{
public static int MIN { get; private set; } }
public static void Main()
{
MIN = 18;
MIN = 23; // this will still work :(
}
}
或者 - 如果出于某种奇怪的原因 - 你真的想要一个异常而不是编译错误,你可以从常量中创建一个属性并在 setter 中抛出你的异常。
public class Foo
{
static int _min;
public static int MIN { get { return _min; } set { throw new NotSupportedException(); } }
public static void Main()
{
_min = 18;
}
}