最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

第 92 講:C# 3 之自動屬性

2022-03-05 12:50 作者:SunnieShine  | 我要投稿

如果說 C# 2 的誕生是為了修補(bǔ)和擴(kuò)充 C# 原生語法的話,那么 C# 3 就是為了優(yōu)雅而存在。今天要說的語法是大大簡化了書寫的代碼量,它叫自動屬性(Auto-Implemented Properties)??梢詮挠⒄Z發(fā)現(xiàn),這個詞組翻譯成“自動實(shí)現(xiàn)的屬性”更為合適。

Part 1 引例

假設(shè)我們還是和以前一樣,實(shí)現(xiàn)一個學(xué)生類型,它包含姓名、年齡和性別三個屬性的話,那么原本代碼應(yīng)該這么寫:

可以從代碼發(fā)現(xiàn),屬性的封裝模式都是完全一致的,可 C# 原生語法和 C# 2 卻非得要求我寫這么一長串。C# 3 考慮到了這個問題,于是開始優(yōu)化和簡化代碼,做到極致。

C# 3 開始引入了一個全新的屬性的語法:自動屬性。它讓你的屬性聲明,長得更像抽象屬性的語法,只是不帶 abstract 關(guān)鍵字:

是的,這樣書寫代碼就 OK 了。這就是自動屬性,編譯器會自動把這段代碼翻譯成上面的完整版本,也沒有任何的區(qū)別。本文結(jié)束。

Part 2 如何區(qū)分接口里的屬性、抽象屬性和自動屬性語法?

可以從語法里看出,這個語法完全就是直接照搬了抽象屬性的語法,還有接口里的屬性的聲明的語法。因?yàn)橹挥谐橄髮傩院徒涌诶锏膶傩裕?/span>getset 關(guān)鍵字后面才會直接跟分號結(jié)尾。因?yàn)樗谡Z法規(guī)定上是抽象的,抽象的成員是不能有實(shí)現(xiàn)的。因此,C# 的抽象屬性和接口內(nèi)屬性,都是這樣的語法。

可問題就在于,現(xiàn)在有了這個新語法后,這個語法長相跟抽象屬性一點(diǎn)區(qū)別都沒有,那么怎么區(qū)分呢?

其實(shí),很好區(qū)分。兩點(diǎn):

  1. 如果是接口內(nèi)屬性,那么一定不是自動屬性;

  2. 如果屬性有 abstract 修飾符,那么也一定不是自動屬性。

我們現(xiàn)場舉例。

很輕松地可以了解到,Base 類型的 Property、Derived2 類型的 PropertyProperty2 都是有 abstract 修飾符的,因此它們都不是自動屬性,而是抽象屬性的語法;而 Derived 里的 Property 屬性,以及 Derived3 類型里的 Property2 因?yàn)闆]有 abstract 修飾符,還都是在類里(而不是接口類型里),因此它們都是自動屬性。

Part 3 必須同時有 getter 和 setter 才能使用自動屬性

請注意前文給的代碼。Derived2 類型里的 Property2 抽象方法只要求實(shí)現(xiàn) getter,因此重寫的時候你只能對屬性給出 getter,而不能包含 setter。但是,自動屬性目前僅允許既有 getter 又有 setter 的屬性這么省略。正是因?yàn)橛羞@個限制,因此第 23 行的只有 getter 的屬性必須完整寫出取值操作的代碼。

可為什么這樣限制呢?原因很簡單:因?yàn)樵O(shè)計(jì)代碼的時候,也不會有人考慮把一個東西通過屬性只讀取出來。實(shí)用的屬性應(yīng)該是 getter 和 setter 都有的情況,這樣我可以避免自己聲明構(gòu)造器的同時,來完成初始化操作,使用前面我們才學(xué)過的語法:對象初始化器。

對象初始化器的操作就只需要保證對象的屬性和字段能夠賦值進(jìn)去。那么,我使用自動屬性的語法來完成屬性的聲明,難道就不叫屬性了嗎?當(dāng)然叫。而且不但叫屬性,還因?yàn)橥瑫r帶有 getter 和 setter 的關(guān)系,可以允許我們使用對象初始化器的語法來完成初始化,可以更靈活的給屬性賦值。

對象初始化器的賦值是可選的(Optional)。換句話說,對象初始化器并沒有要求你必須對所有屬性全部都初始化,而你要做的,只是選取你必須初始化的部分來初始化就可以了:

不賦值,就保持屬性對應(yīng)的那個底層字段是默認(rèn)數(shù)值,僅此而已。所以,如下的語法里,可以通過注釋了解這個寫法的正確性。

總之,沒 abstract 修飾的屬性都是自動屬性(只要沒放在接口里),而既然是自動屬性,那么它就只允許同時包含 getter 和 setter 的情況;而有 abstract 修飾的屬性由于不是自動屬性,因此不論只有 getter、只有 setter、還是都有,它們都是可以的。

Part 4 自動屬性的存在擴(kuò)充了數(shù)據(jù)成員的范圍

C# 3 誕生的自動屬性除了簡化代碼的意義以外,它還改變了“數(shù)據(jù)成員”這個早就接觸過的詞語的定義范疇。以前我們數(shù)據(jù)成員只包含字段,因?yàn)橹挥凶侄尾攀钦嬲鎯?shù)據(jù)的。在那個時候,屬性只用來封裝字段,因此只有字段是數(shù)據(jù)成員?,F(xiàn)在 C# 3 誕生的特性自動屬性可以允許我們不再書寫出背后的字段,而是簡寫為屬性本身。所以,這樣的自動屬性實(shí)際上也暗含了一種存儲數(shù)據(jù)數(shù)值的機(jī)制。因此,我們從 C# 3 開始,就可以把自動屬性劃到數(shù)據(jù)成員的行列里來。

現(xiàn)在,數(shù)據(jù)成員就包含字段和自動屬性兩種情況了。


第 92 講:C# 3 之自動屬性的評論 (共 條)

分享到微博請遵守國家法律
南充市| 渭源县| 商水县| 菏泽市| 沙田区| 陆良县| 利川市| 南宫市| 拜泉县| 合阳县| 珲春市| 聂荣县| 建阳市| 安徽省| 武威市| 金寨县| 平昌县| 新巴尔虎左旗| 罗江县| 河津市| 岚皋县| 鸡东县| 嵩明县| 包头市| 阆中市| 历史| 寿光市| 巫山县| 秀山| 汶上县| 沙田区| 无极县| 郎溪县| 盐亭县| 仁布县| 九龙城区| 浦江县| 建德市| 遂川县| 大冶市| 桑植县|