位置:首頁 > 軟件操作教程 > 編程開發(fā) > C# > 問題詳情

C# 自動(dòng)屬性

提問人:劉團(tuán)圓發(fā)布時(shí)間:2020-12-07

    屬性是訪問對(duì)象狀態(tài)的首選方式,因?yàn)樗鼈兘雇獠看a訪問對(duì)象內(nèi)部的數(shù)據(jù)存儲(chǔ)機(jī)制的實(shí)現(xiàn)。屬性還對(duì)內(nèi)部數(shù)據(jù)的訪問方式施加了更多控制,本章代碼在多處體現(xiàn)了這一點(diǎn)。但是,一般以非常標(biāo)準(zhǔn)的方式定義屬性,即通過一個(gè)公共屬性來直接訪問一個(gè)私有成員。其代碼非常類似于上一節(jié)的代碼,這是Visual Studio重構(gòu)工具自動(dòng)生成的。

    重構(gòu)功能肯定加快了鍵入速度,不過除此以外,C#另外提供了一種方式:自動(dòng)屬性。對(duì)于自動(dòng)屬性,可以用簡化的語法聲明屬性,譯器會(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ì)過度地降低屬性的可讀性:

    public int MylntProp { get; set; }

我們按照通常的方式定義屬性的可訪問性、類型和名稱,但沒有給get或set塊提供實(shí)現(xiàn)代碼。這些塊的實(shí) 現(xiàn)代碼(和底層的字段)都由編譯器提供。


    使用自動(dòng)屬性時(shí),只能通過屬性訪問數(shù)據(jù),不能通過底層的私有字段來訪問,因?yàn)槲覀儾恢赖讓铀接凶侄蔚拿Q(該名稱是在編譯期間定義的)。但這并不是一個(gè)真正意義上的限制,因?yàn)榭梢灾苯邮褂脤傩悦?。自?dòng)屬性的唯一限制是它們必須包含get和set訪問器,無法使用這種方式定義只讀或只寫屬性。但可以改變這些訪問器的可訪問性。例如,可采用如下方式創(chuàng)建一個(gè)外部只讀屬性:

    public int MylntProp { get; private set; }

    此時(shí),只能在類定義的代碼中訪問MylntProp的值。

    C#6引入了兩個(gè)與自動(dòng)屬性相關(guān)的新概念:只有g(shù)et訪問器的自動(dòng)屬性,和自動(dòng)屬性的初始化器。在C#6之前,自動(dòng)屬性需要set訪問器,來限制不變數(shù)據(jù)類型的使用。不變數(shù)據(jù)類型的簡單定義是,一旦創(chuàng)建,就不會(huì)改變狀態(tài)。最著名的不變類型是SysteuLString。使用不變的數(shù)據(jù)類型有很多優(yōu)點(diǎn),比如簡化了并發(fā)編程和線程的同步。

    并發(fā)編程和線程的同步是高級(jí)主題,本書不進(jìn)一步討論。然而一定要知道只有g(shù)et訪問器的自動(dòng)屬性。它 們使用以下語法創(chuàng)建,注意不再需要set訪問器:

    public int MylntProp { get; }

自動(dòng)屬性的初始化功能由以下聲明字段的方式實(shí)現(xiàn):

    public int MylntProp { get; } = 9;

繼續(xù)查找其他問題的答案?

相關(guān)視頻回答
回復(fù)(0)
返回頂部