寫在前邊:
不知道怎麼的,上一篇說放到首頁看看,今天來看才發現沒有放上去,做事情還真不細心,改、改、改!其實,早知道C# 4.0都有了,但是連C# 3.0都還沒有弄清楚,使用還是堅持這個系列,做完再寫C# 4.0吧。技術前輩們肯定早都知道這些東西了,不過呢,我也只是學習,只是把我的學習同大家分享而已!
一、自動實現的屬性
全稱應該叫自動實現的屬性(Auto-implemented propertIEs),在上一篇中,給了簡單的例子,說的是當屬性訪問器中不需要其他邏輯時,自動實現的屬性可使屬性聲明變得更加簡潔。如前邊的例子,在C# 2.0中:
private int m_one;
public int One
{
get { return m_one; }
set { m_one = value; }
}
這個屬性只有存(set)取(get)邏輯,沒有其它諸如動態分配、或是按條件存取的邏輯,在C# 3.0中,完全可以寫成:
public int One { get; set; }
從而不需要創建與該屬性對應的私有變量。
自動實現的屬性必須同時聲明get和set訪問器。若要創建readonly自動實現屬性,請給予它private set訪問器。如:
public string Name { get; private set; }
這樣,這個屬性只讀,不能對其進行存操作。那有人肯定要問,要給Name賦值,怎麼辦。仔細理解這個private set的含義,在面向對象的概念中,private表示在自己類的內部還是可以訪問的,也就是,這裡說的只讀屬性,在定義這個屬性的類本身中,還是可以訪問的,如下:
public class EDClass
{
public string Name { get; private set; }
public EDClass()
{
Name = "QQ";
}
public void setName()
{
Name = "QQ";
}
}
這樣是完全沒有問題的,但是,如果通過obj.Name = value肯定不行的,要不然就不叫readonly了。例如:
EDClass cls = new EDClass();
cls.Name = "QQ";
報錯:The property or indexer 'CSharpStudy.EDClass.Name' cannot be used in this context because the set accessor is inAccessible
還有一點需要說明,自動實現的屬性(Property) 不允許具有屬性 (Attribute)。如果您必須在屬性(Property) 的後備字段上使用屬性(Attribute),則應該只創建常規屬性(Property)。好繞口,仔細分析這些概念,在面向對象的概念中,類的成員(member)又稱為屬性(Attribute),其實,在一般來講,在C++中稱為成員(Member)變量,在C#中稱為屬性(Attribute),或字段。而這裡的自動屬性用的是Property,試想,定義了一個自動屬性:
public string Name { get; set; }
又想定義一個私有成員(屬性,Attribute)與之關聯:
private string _name;
不會報錯,但是肯定關聯不了,它只被認為是類的一個私有成員變量