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