使用屬性而不是可訪問的資料成員
- 在日後產生新的需求或行為時,屬性更易於修改。例如,你很快會覺得客戶物件不應該有空白的名稱。若你之前使用了公有屬性來封裝Name,那麼只需要修改一處即可:
public class Customer
{
private string m_Name;
public string Name
{
get { return m_Name; }
set
{
if (string.IsNullOrEmpty(value))
throw new System.ArgumentException("Name can not be blank.", "m_Name");
m_Name = value;
}
}
}
- 因為屬性是使用方法來實現的,所以新增多執行緒支援也非常簡單:
public class Customer
{
private object m_SyncHandle = new object();
private string m_Name;
public string Name
{
get
{
lock(m_SyncHandle)
return m_Name;
}
set
{
if (string.IsNullOrEmpty(value))
throw new System.ArgumentException("Name can not be blank.", "m_Name");
lock(m_SyncHandle)
m_Name = value;
}
}
}
- 屬性可以擁有方法的所有語言特性,例如:屬性可以是虛的:
public class Customer
{
public virtual string Name
{
get;
set;
}
}
也可以是抽象的:
public interface INameValuePair<T>
{
string Name
{
get;
}
T Value
{
get;
set;
}
}
需要注意的是,雖然抽象的屬性其語法和隱式屬性完全相同,但是編譯器不會自動地生成任何實現。介面只是定義了一個契約,強制所有實現了該介面的型別都必須滿足。
- 有時候你可能會想能不能先用資料成員來實現,然後在稍後需要其他各種功能的時候再改成屬性呢?看上去是個不錯的策略,但實際上卻行不通。考慮以下這個類的定義:
public class Customer
{
public string Name;
}
// Client:
Customer enigmaJJ = new Customer();
enigmaJJ.Name = "EnigmaJJ";
看似以上的程式碼在日後若是將Name改成屬性,那麼程式碼本身也可以無需修改而保持正常。但這並不是完全正確的。屬性並不是資料,屬性的訪問和資料的訪問將會生成不同的MSIL(Microsoft Intermediate Language)指令。也就是說,雖然屬性和資料成員在原始碼層次上是相容的,不過在二進位制層面上卻大相徑庭。這也意味著,若將資料成員改成了與之等同的屬性,那麼就必須重新編譯所有用到該資料成員的程式碼。C#語言本身的一個目標就是支援釋出某個單一程式集時,不需要更新整個應用程式。而這個將資料成員改為屬性的簡單操作卻破壞了二進位制相容性,也會讓更新單一程式集變得非常困難。
相關文章
- 薦讀|屬性與可直接訪問的資料成員之間應該如何選
- JavaScript物件的資料屬性與訪問器屬性JavaScript物件
- MDX中使用成員屬性-資料庫專欄,SQL Server資料庫SQLServer
- 深入理解物件的資料屬性與訪問器屬性物件
- 始終使用屬性(Property),而不是欄位(Data Member)
- Tomcat中訪問資料庫使用屬性檔案問題Tomcat資料庫
- c#繼承父子類成員間的互訪問性C#繼承
- Java中類的成員方法和變數的訪問許可權Java變數訪問許可權
- 從屬性剋制延伸而來的多屬性隊伍養成設計
- 定製可訪問資料
- 類&成員可見性&繼承繼承
- outerDocument訪問外部屬性方法
- c#屬性訪問器C#
- JavaScript訪問物件的屬性和方法JavaScript物件
- c# public_protected_private許可權訪問符_屬性訪問器get_setC#
- 資料安全合規需要從基於角色的訪問控制邁向基於屬性的訪問控制
- javaScript事件(四)event的公共成員(屬性和方法)JavaScript事件
- JavaScript get set 訪問器屬性JavaScript
- c# tcbs屬性訪問器C#
- 如何提高網站的可訪問性?網站
- js訪問物件屬性的2個方法JS物件
- 一、訪問物件屬性和方法的操作物件
- 資料庫插入的時候怎麼使用NULL而不是空字串資料庫Null字串
- 【python】物件導向之類成員(屬性)Python物件
- Java中變數之區域性變數、本類成員變數、父類成員變數的訪問方法Java變數
- 屬性動畫跳轉展示資料(可切換可搜尋)動畫
- java類成員中的訪問級別有哪些Java
- web標準,可用性和可訪問性Web
- 使用 CSS perfer-* 規範,提升網站的可訪問性與健壯性CSS網站
- Ubuntu共享資料夾訪問許可權問題Ubuntu訪問許可權
- MarketingCharts: 在上網和訪問Facebook時,越來越多的人使用智慧終端而不是PCGC
- 開箱即用的網站可訪問性提升指南網站
- css屬性的可繼承性CSS繼承
- 課時45:魔法方法:屬性訪問
- Python 訪問和設定私有屬性Python
- 原型鏈上的get與set訪問器屬性原型
- Python 中的屬性訪問與描述符Python
- javascript 物件屬性的get set訪問器寫法JavaScript物件