readonly vs. const [C#]
[1] readonly vs. const [C#]
[2] readonly vs. const [C#]
[2] readonly vs. const [C#]
Features:
- readonly和const都是用來標識常量的[1]。
- const可用于修飾class的field或者一個局部變量(local variable);而readonly僅僅用于修飾class的field。
- const常量的值必定在編譯時就已明確并且恒定的;而readonly常量卻有一點不同,那就是其值可以在運行時編譯,當然,它也必須遵守作為常量的約束,那就是值必須恒定不變。
- const常量必須在聲明的同時對其進行賦值,并且確保該值在編譯時可確定并恒定;而readonly常量則可以根據情況選擇在聲明的同時對其賦予一個編譯時確定并恒定的值,或者將其值的初始化工作交給實例構造函數(instant constructor)完成。如:public readonly string m_Now = DateTime.Now.ToString();,m_Now會隨著運行時實際情況變化而變化。
- const常量屬于類級別(class level)而不是實例對象級別(instant object level),并且它不能跟static結合一起使用,該常量的值將由整個類的所有實例對象共同分享(詳細論述參見后面的Remark區域)。
- readonly常量既可以是類級別也可以是實例對象級別的,這取決于它的聲明以及初始化工作怎么實施。readonly可以與static結合使用,用于指定該常量屬于類級別,并且把初始化工作交由靜態構造函數(static constructor)完成(有關如何把readonly常量聲明為類級別或實例對象級別的論述清參見后面的Remark區域) 。
- 能被const修飾聲明為常量的類型必須是以下的基元類型(primitive type):sbyte, byte, short, ushort, int, uint, long, ulong, char, float, double, float, bool, decimal, string。
- object, 數組(Array)和結構(struct)不能被聲明為const常量。
- 一般情況下,引用類型是不能被聲明為const常量的,不過有一個例外:string。該引用類型const常量的值可以有兩種情況,string或null。其實,string雖然是引用類型,但是.NET卻對它特別處理,這種處理叫做字符串恒定性(immutable),使得string的值具有只讀特性。有關字符串恒定性的內容,可以參考《Microsoft .NET框架程序設計(修訂版)》。
Examples:
Code using System; public class Order { public Order() { Guid guid = Guid.NewGuid(); ID = guid.ToString("D"); } // 對于每一份訂單,其訂單序號都是實時確定的常量。 style="color: #008000;"> public readonly string ID; public override string ToString() { return "Order ID: " + ID; } }
Explaintion:
- 如果結合數據庫使用,ID field通常都會都會與某個表的主健(primary key)關聯起來,如Orders表的OrderID。
- 數據庫的主健通常采用以下三種方式:
- 自動遞增值。你可以通過把DataColumn.AutoIncrement設定為true值來激活自動遞增特性。
- 唯一名稱。這個是使用自己定義的算法來生成一個唯一序列號。
- GUID(全局唯一標識符)。你可以通過System.Guid結構來生成GUID,如上例。
Code using System; class Customer { public Customer(string name, int kind) { m_Name = name; m_Kind = kind; } public const int NORMAL = 0; public const int VIP = 1; public const int SUPER_VIP = 2; private string m_Name; public string Name { get { return m_Name; } } private readonly int m_Kind; public int Kind { get { return m_Kind; } } public override string ToString() { if(m_Kind == SUPER_VIP) return "Name: " + m_Name + "[SuperVip]"; else if(m_Kind == VIP) return "Name: " + m_Name + "[Vip]"; else return "Name: " + m_Name + "[Normal]"; } }
[第1頁][第2頁]
全站熱搜