1.C#的屬性在被訪問的時(shí)候看起來(lái)好像是數(shù)據(jù)成員,但其實(shí)是方法。2.在.NET框架中,一般使用屬性表達(dá)公有數(shù)據(jù)成員。3..NET框架中的數(shù)據(jù)綁定類支持屬性。
1.隨著時(shí)間的推移,新的需求影響原來(lái)類型的實(shí)現(xiàn)。比如在員工管理系統(tǒng)中有如下代碼:

public class Person { PRivate string name; public string Name { get{return name;} set{this.name = value;} } ....//其它屬性 } View CodePerson類聲明了一個(gè)Name的屬性,表示這個(gè)人的名字。程序運(yùn)行了一段時(shí)間后,需求發(fā)生了變化,要求Name必須不為null或者empty。
我們一般的做法會(huì)是1)在界面輸入的地方增加驗(yàn)證;2)寫一個(gè)單獨(dú)的程序或者sql修改數(shù)據(jù)庫(kù)的數(shù)據(jù)。但問題來(lái)了如果這個(gè)Person類有好幾個(gè)錄入的界面,比如員工的增加界面、員工修改界面,在修改的時(shí)候就要修改兩次。大家肯定發(fā)現(xiàn)了,如果有很多這樣界面,那么就需要修改很多這樣的地方。再比如Person類被很多子類繼承了,比如Leader、BussinessMan等,那么就需要在每個(gè)用到這些類地方進(jìn)行修改。幸虧我們寫的是C#,幸虧你用的是屬性。只需要完成以下修改就可以到達(dá)我們的目的了。

public class Person { private string name; public string Name { get{return name;} set { if(string.IsNullOrEmpty(value)) { throw new ArgumentException("Name cannot be blank","Name"); } this.name = value; } } ....//其它屬性 } View Code
這樣是不是很方便?類似的,屬性添加多線程支持更方便、可以作為接口定義的一部分、可以聲明為虛屬性、訪問權(quán)限控制等。這些都是平常大家都會(huì)用的,此處就不再細(xì)說(shuō)。2.索引器如果類型接口需要包含一些索引數(shù)據(jù)項(xiàng),那么這個(gè)時(shí)候可以使用索引器。C#中索引器又叫含參屬性(parameterized property)。這個(gè)語(yǔ)法大家一般不會(huì)聲明,但卻都在使用。比如說(shuō)List<int> intList = new List<int>();Console.Write(intList[0]);大家可能經(jīng)常寫這種代碼,但只是對(duì)這個(gè)語(yǔ)法的名字不太熟悉,或者經(jīng)常寫但不知道如何聲明這種語(yǔ)法。其實(shí)這個(gè)就是索引器,聲明的語(yǔ)法也很簡(jiǎn)單。比如一個(gè)人可能有多個(gè)地址(工作地址、家庭住址、籍貫地址等等),代碼如下:
public class Person { private Dictionary<string,Address> addrDic = new Dictionary<string,string>(); public Address this[string name] { get { return addrDic[name]; } set { this.addrDic[name] = value;//此處也可以改為先判斷有沒有key,沒有key就添加。 } } }除此之外,C#還支持多維索引器,比如public object this[row,col],可以表示一個(gè)Excel表格的某行某列的單元格里面的值,這樣封裝后的Excel幫助類肯定比xx.GetExcelValue(row,col)這種方法更容易使用。
顯而易見,使用屬性的代碼沒有使用數(shù)據(jù)成員的代碼效率快(因?yàn)閷傩员举|(zhì)上是方法)。但是,屬性也不見得比說(shuō)那個(gè)數(shù)據(jù)成員的代碼慢。這是為什么呢?JIT編譯器會(huì)對(duì)方法進(jìn)行內(nèi)聯(lián)處理(具體含義自行g(shù)oogle),屬性作為方法的一種也是會(huì)進(jìn)行內(nèi)聯(lián)處理,那么屬性和數(shù)據(jù)成員的效率就沒有區(qū)別。當(dāng)然,即便沒有被內(nèi)聯(lián),屬性調(diào)用的效率相對(duì)于函數(shù)調(diào)用的成本也是可以忽略不計(jì)的,只有在一些極少數(shù)的情況下這種差別才值得我們注意。
這個(gè)問題,大家只記住不可以就行了。具體原因如下:1.對(duì)于屬性和公有字段使用的源代碼看起來(lái)一樣但I(xiàn)L代碼是不一樣的;2.如果一個(gè)類型的公有數(shù)據(jù)成員改為屬性,那么會(huì)破壞二進(jìn)制的兼容性,在程序已經(jīng)部署的情況下可能會(huì)帶來(lái)升級(jí)的麻煩。
1.對(duì)于暴漏在類型的公有接口或者受保護(hù)接口中的數(shù)據(jù),我們應(yīng)該使用屬性。2.對(duì)于具有序列或者字典特征的類型,我們應(yīng)該采用索引器。3.對(duì)于所有的數(shù)據(jù)成員,我們應(yīng)該都應(yīng)該聲明為私有。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注