可能重複:
What is the difference between const and readonly?常量和只讀在C#中?
我有疑問,在C#是在不斷的區別是什麼,並用簡單的問題或任何參考只讀解釋。
可能重複:
What is the difference between const and readonly?常量和只讀在C#中?
我有疑問,在C#是在不斷的區別是什麼,並用簡單的問題或任何參考只讀解釋。
A const
在編譯時初始化,不能更改。
A readonly
在運行時被初始化,但只能執行一次(在構造函數或內聯聲明中)。
常量(const
)必須在編譯時已知。
readonly
字段可以用運行時已知的值進行初始化(並且僅初始化)。
一個const
無法改變,申報價值被燃燒成在編譯時的代碼。
A readonly
字段在運行時初始化,但只能在對象的構造函數或字段聲明本身中初始化。
由於const值在編譯時計算,如果在assembly2中定義的assembly1中使用const,則需要在const值更改的情況下再次編譯assembly1。 由於評估是在運行時進行的,因此只讀字段不會發生這種情況。
+1提到重新編譯「問題」。 – 2010-04-01 11:21:53
重新編譯問題應該永遠不會成爲設計良好的代碼的問題,因爲'const'的值應該永遠不會改變。如果一個'const'的值確實改變了,那麼它首先不是一個常數,並且不應該被聲明爲這樣。 – LukeH 2010-04-01 15:01:44
const
是一個編譯時常量:您編寫的值會插入到您的代碼中。這意味着您只能擁有編譯器可以理解的常量值類型,例如整數和字符串。不像只讀的,你不能一個函數的結果分配給一個const領域,例如:
class Foo {
int makeSix() { return 2 * 3; }
const int const_six = makeSix(); // <--- does not compile: not initialised to a constant
readonly int readonly_six = makeSix(); // compiles fine
}
一個readonly
場,而另一方面,在運行時初始化,並且可以有任何類型和值。 readonly
標記僅表示該字段一旦設置就不能重新分配。
但要注意,只讀集合或對象字段仍然可以更改其內容,而不是所設置的集合的標識。這是完全正確的:
class Foo {
readonly List<string> canStillAddStrings = new List<string>();
void AddString(string toAdd) {
canStillAddStrings.Add(toAdd);
}
}
,但我們將無法在這種情況下,以取代參考:
class Foo {
readonly List<string> canStillAddStrings = new List<string>();
void SetStrings(List<string> newList) {
canStillAddStrings = newList; // <--- does not compile, assignment to readonly field
}
}
在C#中,常量成員必須在編譯時賦值。但是您可以在運行時初始化一次只讀成員。
constast在運行時初始化並可用作靜態成員。只讀一次就可以在運行時初始化。
@Surya:你在SO上試過搜索功能嗎? http://stackoverflow.com/search?q=const+readonly – 2010-04-01 08:44:48
沒有Mr.Jorn Schou其實我昨天去了採訪那裏,他們問我這個問題 – 2010-04-01 08:57:59