const 常量
1.它可以用來修飾類的字段或局部變量.const修飾的變量只能是值類型,不能是引用類型.其實准確的說它也能修飾引用類型,只是引用類型只能為null,不能實例化.那這樣的引用變量也等於沒啥用處的啊.比如const int[] array = {1,2,3}是錯的.不過const int[] array = null;是對的
2.在聲明時要賦值,賦值以後不能再改.它修飾的變量的值是在編譯的時候就確定了.const int a = 4; 是對的.const int b;沒有賦值就錯了啊.
3.它默認是static類型,那麼它修飾的是類的字段的話則只能通過類直接引用,不能通過類的實例引用.也不能再用static來一起修飾變量
readonly
1.只能修飾類的字段,不能修飾局部變量
2.聲明時賦值或者通過構造函數給賦值,其他地方不能賦值.
3.它修飾引用類型時有點特別的地方,它修飾的引用變量一當引用某個類型時就不能再引用其他類型,但是引用的類型裡面的內容可以修改
比如readonlyint [] array = {1,2,3};我們不能再在其他地方來個array = new[]{4,5,6,7};了這樣會出錯,但我們可以這樣改數組裡的值array[0] = 100;這是對的
static
1.可用來修飾類字段,函數,類.靜態類裡面所有的函數和字段必須都是靜態的. 靜態的字段和函數只能通過類直接引用,不能通過類的實例引用
2.靜態構造函數,靜態構造函數聲明方式跟一般構造函數類似,只不能不能用任何修飾符.只能在前面加個static.靜態構造函數裡面只能初始化靜態變量.
我們不用自己去調用靜態構造函數,是系統默認調用的.當實例化一個類,或者使用為中的靜態字段時會自動調用.而且調用一次後就不會再調用.
static readonly
這兩個關鍵字可以組合使用.大部分時候和const達到的效果一樣.但也有一些區別
1.const 必須聲明時就賦值.static readonly可以先不賦值,在靜態構造函數中再賦值.
2.const不能修飾引用類型.而且static readonly可以.例如static readonly ClassName name = new ClassName();是正確的.而此時用const修飾就是錯的
3.由於const修飾的變量值是在編譯時確定的,而且static readonly的值是在運行時確定的.所以相同的表達式值可能不一樣
比如
public class
{
const int aa= bb + 10;
const int bb= 10;
staticreadonly int a = b + 10; //這會b還沒賦值,默認為0.如果把b放到a 前面去結果就是20了
staticreadonly int b = 10;
public voidPrintSom()
{
console.writeline(aa);//20
console.writeline(bb);//10
console.writeline(a);//10
console.writeline(b);//10
}
}
摘自 聰明的笨蛋