我們都知道,const和static readonly的確很像:通過類名而不是物件名進行訪問,在程式中唯讀等等。在多數情況下可以混用。
二者本質的區別在於,const的值是在編譯期間確定的,因此只能在宣告時通過常量表示式指定其值。而
static readonly是在執行時計算出其值的,所以還可以通過靜態建構函式來賦值。
明白了這個本質區別,我們就不難看出下面的語句中static readonly和const能否互換了:
1. static readonly myclass myins = new myclass();
2. static readonly myclass myins = null;
3. static readonly a = b * 20;
static readonly b = 10;
4. static readonly int constintarray = new int ;
5. void somefunction()
1:不可以換成const。new操作符是需要執行建構函式的,所以無法在編譯期間確定
2:可以換成const。我們也看到,reference型別的常量(除了string)只能是null。
3:可以換成const。我們可以在編譯期間很明確的說,a等於200。
4:不可以換成const。道理和1是一樣的,雖然看起來1,2,3的陣列的確就是乙個常量。
5:不可以換成readonly,readonly只能用來修飾類的field,不能修飾區域性變數,也不能修飾property等
其他類成員。
因此,對於那些本質上應該是常量,但是卻無法使用const來宣告的地方,可以使用static readonly。例
如c#規範中給出的例子:
public class color
}在通俗一點說,const型別賦值必須是脫離系統執行時才能初始化的值(const page p=null正確,const page p= new page()錯誤,因為 new page()需要執行時才初始化)可以使用static readonly(static readonly page p= new page())
const物件和const函式
當乙個類的函式的參數列不同時,能過載函式,當函式的const性不同時,也能過載函式。如下所示 include a.h 定義了ca類 class cbigclass const ca getvalue const ca getvalue private ca m value 客戶端 如下 ca ca ...
頂層const和底層const
頂層const 本身是乙個常量 底層const 所指的物件是乙個常量 int const p1 i const修飾p1,p1本身是乙個const,所以這個const是頂層const const int ci 42 const修飾ci,ci本身是乙個const,頂層 const int p2 ci c...
頂層const和底層const
1.頂層 const 與底層 const概念 指標本身是乙個物件,因為,指標實際對應著記憶體單元的一段儲存空間,然而,指標所指向的也是乙個資料物件,因此,指標是乙個常量與指標所指向的是乙個常量是兩個完全不同的概念,頂層 const表示的是指標本身是乙個常量,底層const 表示的是指標所指的物件是乙...