C# 自動(dòng)屬性
屬性是訪問(wèn)對(duì)象狀態(tài)的首選方式,因?yàn)樗鼈兘雇獠看a訪問(wèn)對(duì)象內(nèi)部的數(shù)據(jù)存儲(chǔ)機(jī)制的實(shí)現(xiàn)。屬性還對(duì)內(nèi)部數(shù)據(jù)的訪問(wèn)方式施加了更多控制,本章代碼在多處體現(xiàn)了這一點(diǎn)。但是,一般以非常標(biāo)準(zhǔn)的方式定義屬性,即通過(guò)一個(gè)公共屬性來(lái)直接訪問(wèn)一個(gè)私有成員。其代碼非常類似于上一節(jié)的代碼,這是Visual Studio重構(gòu)工具自動(dòng)生成的。
重構(gòu)功能肯定加快了鍵入速度,不過(guò)除此以外,C#另外提供了一種方式:自動(dòng)屬性。對(duì)于自動(dòng)屬性,可以用簡(jiǎn)化的語(yǔ)法聲明屬性,譯器會(huì)自動(dòng)添加未鍵入的內(nèi)容。確切地講,編譯器會(huì)聲明一個(gè)用于存儲(chǔ)屬性的私有字段,并在屬性的get和set塊中使用該字段,我們不必考慮細(xì)節(jié)。
使用下面的代碼結(jié)構(gòu)就可以定義一個(gè)自動(dòng)屬性:
public int MylntProp
{
get;
set;
}
甚至可在—行代碼上定義自動(dòng)屬性,以便節(jié)省空間,而不會(huì)過(guò)度地降低屬性的可讀性:
public int MylntProp { get; set; }
我們按照通常的方式定義屬性的可訪問(wèn)性、類型和名稱,但沒(méi)有給get或set塊提供實(shí)現(xiàn)代碼。這些塊的實(shí) 現(xiàn)代碼(和底層的字段)都由編譯器提供。
使用自動(dòng)屬性時(shí),只能通過(guò)屬性訪問(wèn)數(shù)據(jù),不能通過(guò)底層的私有字段來(lái)訪問(wèn),因?yàn)槲覀儾恢赖讓铀接凶侄蔚拿Q(該名稱是在編譯期間定義的)。但這并不是一個(gè)真正意義上的限制,因?yàn)榭梢灾苯邮褂脤傩悦?。自?dòng)屬性的唯一限制是它們必須包含get和set訪問(wèn)器,無(wú)法使用這種方式定義只讀或只寫屬性。但可以改變這些訪問(wèn)器的可訪問(wèn)性。例如,可采用如下方式創(chuàng)建一個(gè)外部只讀屬性:
public int MylntProp { get; private set; }
此時(shí),只能在類定義的代碼中訪問(wèn)MylntProp的值。
C#6引入了兩個(gè)與自動(dòng)屬性相關(guān)的新概念:只有g(shù)et訪問(wèn)器的自動(dòng)屬性,和自動(dòng)屬性的初始化器。在C#6之前,自動(dòng)屬性需要set訪問(wèn)器,來(lái)限制不變數(shù)據(jù)類型的使用。不變數(shù)據(jù)類型的簡(jiǎn)單定義是,一旦創(chuàng)建,就不會(huì)改變狀態(tài)。最著名的不變類型是SysteuLString。使用不變的數(shù)據(jù)類型有很多優(yōu)點(diǎn),比如簡(jiǎn)化了并發(fā)編程和線程的同步。
并發(fā)編程和線程的同步是高級(jí)主題,本書不進(jìn)一步討論。然而一定要知道只有g(shù)et訪問(wèn)器的自動(dòng)屬性。它 們使用以下語(yǔ)法創(chuàng)建,注意不再需要set訪問(wèn)器:
public int MylntProp { get; }
自動(dòng)屬性的初始化功能由以下聲明字段的方式實(shí)現(xiàn):
public int MylntProp { get; } = 9;
點(diǎn)擊加載更多評(píng)論>>