2010-04-01 27 views

回答

12

A const在編譯時初始化,不能更改。

A readonly在運行時被初始化,但只能執行一次(在構造函數或內聯聲明中)。

3

常量(const)必須在編譯時已知。

readonly字段可以用運行時已知的值進行初始化(並且僅初始化)。

2

一個const無法改變,申報價值被燃燒成在編譯時的代碼。

A readonly字段在運行時初始化,但只能在對象的構造函數或字段聲明本身中初始化。

2

由於const值在編譯時計算,如果在assembly2中定義的assembly1中使用const,則需要在const值更改的情況下再次編譯assembly1。 由於評估是在運行時進行的,因此只讀字段不會發生這種情況。

+0

+1提到重新編譯「問題」。 – 2010-04-01 11:21:53

+2

重新編譯問題應該永遠不會成爲設計良好的代碼的問題,因爲'const'的值應該永遠不會改變。如果一個'const'的值確實改變了,那麼它首先不是一個常數,並且不應該被聲明爲這樣。 – LukeH 2010-04-01 15:01:44

4

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 
    } 
} 
0

在C#中,常量成員必須在編譯時賦值。但是您可以在運行時初始化一次只讀成員。

1

constast在運行時初始化並可用作靜態成員。只讀一次就可以在運行時初始化。