Effective C# 條款1

來源:互聯網
上載者:User
文章目錄
  • 1. 1  遵循物件導向的原則
  • 1.2 具有彈性

屬性的優點:

  1. 遵循物件導向的原則
  2. 具有彈性
1. 1  遵循物件導向的原則

  屬性在使我們可以將資料成員暴露為公有介面的同時,還為我們提供了在物件導向環境中所期望的封裝。從表面看起來像是資料成員,但內部卻是以方法實現。

 

 

 public class TestClass
{
//成員變數
public string Name;
}

 


  

public class TestClass
{
//屬性
public string Name { get; set; }
}

 

TestClass testClass = new TestClass();

testClass.Name = "TestClass";

  這段代碼非常簡潔和直觀。有人據此就認為以後如果有需要,再將 TestClass 類的資料成員 Name 替換為屬性OK了,而使用TestClass類型的代碼無需做任何改變。這種說法從某種程度上來講是對的。

  屬性在被訪問的時候和資料成員看起來沒有什麼差別。這正是 C#引入新的屬性文法的一個目標。但屬性畢竟不是資料,訪問屬性和訪問資料產生的是不同的 MSIL。在程式編譯後,編譯器在把程式編譯成為MSIL時,會自動把屬性中的get/set編譯成為兩個方法,所以屬效能夠獲得函數的全部好處。但實際區別我們可以通過如下的MSIL分析可知成員變數和屬性是存在區別的。

圖1 TestClass類編譯後的MSIL 

  通過圖1我們沒有找到Name屬性,取而代之的是兩個get_Name / set_Name方法,充分說明了屬性是通過方法的方式調用。

圖2成員變數MSIL

 

圖3屬性MSIL

 

  大家注意儘管訪問屬性和訪問資料成員使用的是同樣的 C#原始碼,但是 C#編譯器卻將它們轉換為不同的IL代碼。

  換句話說,雖然屬性和資料成員在原始碼層次上是相容的,但是在二進位層次上卻不相容。這意味著如果將一個類型的公有資料成員改為公有屬性,那麼我們必須重新編譯所有使用該公有資料成員的C#代碼。

1.2 具有彈性

  使用屬性在修改上也比成員變數更具有彈性,例如程式要判斷成員變數是否為空白時,我們就需在代碼某處加上判斷邏輯,而屬性我們只需在屬性上加上判斷邏輯,省去了煩心尋找要加邏輯的地方。

private string _name;
public string Name
{
get
{
if (_name == null)
return string.Empty;
return _name;
}
set
{
_name = value;
}
}

  由於屬性是採用方法來實現的,因此為它們添加多線程支援就更加容易——直接在get和 set方法中提供同步資料存取控制即可:

public string Name 

{

get

{

lock( this )

{

return _name;

}

}

set

{

lock( this )

{

_name = value;

}

}

}

經驗總結:

  只要打算將資料暴露在類型的公有介面或者受保護介面中,我們都應該使用屬性來實現。對於具有序列或者字典特徵的類型,則應該採用索引器。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.