在C#中,const與readonly定義的值都不能更改,可用於常量的定義,但二者在使用時又存在着一些區別。
1.const
C#使用關鍵字const聲明常量字段或局部變量,C#中的字段是在類或結構中直接聲明的變量。以下值類型可以聲明爲常量:int, long, char, float, double, decimal, bool, byte, short,string。
const定義的常量只能讀取不能更改,並且只能在定義時初始化,不能在構造函數、其它屬性或方法中初始化。不能將一個常量變量聲明爲靜態變量,因爲const定義的字段屬於類訪問,類似於靜態變量,只能通過類名來訪問。例如:
public const int EXAMPLE = 1;
Console.WriteLine(ConstTest.EXAMPLE);
另外,const只能定義值類型與字串,若定義引用類型的變量,只能初始化爲null。
2.readonly
readonly定義的變量在運行期間也只能讀取不能更改,但readonly分爲實例只讀變量與靜態只讀變量。可聲明的值類型包括:int, long, char, float, double, decimal, bool, byte, short,string。
實例只讀變量在定義時或者實例構造函數中初始化,能通過對象訪問,例如:
public class ReadOnlyClass
{
public readonly int temp = 0;
public ReadOnlyTest()
{
temp = 1;
}
}
訪問形式:
ReadOnlyClass example = new ReadOnlyClass ();
Console.WriteLine(example.temp);
static readonly 爲靜態只讀變量,可以在定義時或者靜態構造函數中初始化,能通過類名稱訪問,例如:
public class ReadOnlyClass
{
public static readonly int TEMP = 1;
}
訪問形式:
Console.WriteLine(ReadOnlyClass.TEMP);
3.區別
const | readonly |
---|---|
應用於字段或局部變量。 | 應用於字段。 |
在公開的時候分配常量字段。 | 可以在聲明或構造函數時指定,而不是在任何其他方法中。 |
沒有分配內存,因爲在編譯後,在IL代碼中嵌入了常量值。 | 分配動態內存,可在運行時獲取。 |
默認靜態,只能通過類名訪問。 | 需要過類實例訪問的對象,添加static關鍵字後,可成爲類成員。 |
值是常量。 | 屬於類的對象,根據使用的構造函數,值可能會有所不同。 |
對某些類(非原始類型)聲明常量,應將其賦值爲null。 | 聲明非基本類型(引用類型)時,只有引用是不可變的,而不是包含的對象。 |