如果您不能或不想竟在初始化變量之前還是因爲你知道,因爲你有很多事情要做的類型使用靜態構造函數從其他的答案(例如靜態構造函數是一個真正的痛苦調試..)你可以到其他事情:
一個編譯時的解決辦法是包變量在自己的類型爲非靜態只讀並持有的靜態引用這種類型
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 :(
}
}
或者 - 如果出於某種奇怪的原因 - 你真的想要一個例外,而不是編譯錯誤,你可以做一個財產取出常量和扔你的異常的制定者。
public class Foo
{
static int _min;
public static int MIN { get { return _min; } set { throw new NotSupportedException(); } }
public static void Main()
{
_min = 18;
}
}
來源
2013-06-05 13:38:18
Imi
「這必須拋出一個異常」 - 你真的需要它來編譯,而不是失敗,直到運行時?到目前爲止你的答案可以確保'MIN = 15;'行甚至不會編譯,所以它也不會拋出異常。 – hvd
TS可能並不意味着他希望有一行存在拋出異常的情況,只是該行不會將常量MIN設置爲某個值。 – SamiHuutoniemi
是的,例外是不需要的。只有唯一的價值在運行時必須堅持。 – Bitterblue