(1) readonly和const都是用來標示常數的。
(2) 初始化賦值不同。
const修飾的常數必須在聲明的同時賦值。例如:
public class Class1 { public const int MaxValue = 10; //正确声明 public const MInValue; //错误:常量字段要求提供一个值 public Class1() { MinValue = 10; } }
readonly欄位可以在初始化(宣告或建構子)的過程中賦值。因此,根據所使用的建構函數,readonly欄位可能具有不同的值。
public class Class1 { public readonly int c = 10; //正确声明 public readonly int z; public Class1() { z = 24;//正确 } protected void Load() { z = 24;//错误:无法对只读的字段赋值(构造函数或变量初始值指定项中除外) } }
readonly是實例成員,所以不同的實例可以有不同的常數值,這是readonly比較靈活。
public readonly Color Red = new Color(255, 0, 0); public readonly Color Green = new Color(0, 255, 0); public readonly Color Blue = new Color(0, 0, 255);
(3) const字段是編譯時常數,而readonly字段可用於運行時常數。
const要求編譯器能夠在編譯時計算出確定的值。在編譯的時候,用計算出的這個確定的值去取代調用該常數的每一個地方。因此不能從一個變數中提取值來初始化常數。
readonly允許把一個欄位設定成常數,但可以執行一些運算,可以確定它的初始值。因為readonly是在計算時執行的,所以可以用某些變數初始化。在運行時才確定的該值。
(4) const預設就是靜態的,而readonly如果設定成靜態的就必須顯示聲明。
(5) const修飾的值的類型也有限制,它只能為下列類型之一(或能夠轉換為下列類型):sbyte、byte、short、ushort、int、uint、long、ulong、char、float、 double、decimal、bool、string、enum型別或參考型別。注意能夠宣告為const的參考型別只能為string或值為null的其他參考型別。 readonly可以是任何型別。
這就是說,當我們需要一個const的常數時,若他的型別限制了它不能再編譯時被計算出確定的值來,那麼我們可採取將之聲明為static readonly的方式來解決。但兩者之間還是有一點細微的差別的。看下面兩個不同的檔案。
file1.cs
using System; namespace MyNamespace1 { public class MyClass1 { public static readonly int myField = 10; } }
file2.cs
namespace MyNamespace2 { public class MyClass1 { public static void Main() { Console.WriteLine(MyNamespace1.MyClass1.myField); } } }
兩個類別分屬於兩個檔案file1.cs和file2.cs,並分開編譯。當檔案file1.cs內的網域myField宣告為static readonly時,如果我們因為某種需要將myField的值改為20,那麼我們只需要重新編譯檔案file1.cs為file1.dll,在執行file2.exe時即會得到20。
但如果將static readonly改為const後,再改變myField的初始化值時,我們則必須重新編譯所有引用到file1.dll的文件,否則我們引用的MyNamespace1.MyClass1.myField將不會如我們所願而改變。這在大的系統開發過程中尤其需要注意。
(6) object、Array(陣列)和struct(結構)不能被宣告為const常數。
以上就是c#.net中const和readonly的區別的內容,更多相關內容請關注PHP中文網(www.php.cn)!