C# 的未来:主构造函数
我們上次提到主構(gòu)造函數(shù)是 2014 年,當(dāng)時(shí), C# 6 和 VB 12 的候選列表上去掉了主構(gòu)造函數(shù)。去年底,主構(gòu)造函數(shù)重新出現(xiàn),作為提案#2691 ,現(xiàn)在成為 C# 9 的一個(gè)候選項(xiàng)。
主構(gòu)造函數(shù)背后的基本思想是減少初始化類所需的樣板代碼量。
class C(string x) {public string X{get => x;set { if (value == null) throw new NullArgumentException(nameof(X)); x = value; }} }編譯為…
class C {private string _x;public C(string x){_x = x;}public string X{get => x;set { if (value == null) throw new NullArgumentException(nameof(X)); x = value; }} }Richard Gibson 對(duì)它們的用處進(jìn)行了總結(jié):
從我們 30 個(gè)類的代碼庫(kù)中快速抽樣表明,其中的 22 個(gè)(73%)已定義了顯式構(gòu)造函數(shù),而有 21 個(gè)(>95%)什么也沒(méi)做,只是設(shè)置了私有只讀字段)人們很少閱讀可以自動(dòng)生成的代碼(通常被跳過(guò),因?yàn)樗鼈兺ǔ?瓷先ズ苌?#xff09;,因此,它們常常是讓人大吃一驚的錯(cuò)誤來(lái)源。
他繼續(xù)解釋道,這些錯(cuò)誤通常是因?yàn)椴恍⌒陌褬?gòu)造函數(shù)參數(shù)賦給了錯(cuò)誤的字段。
這個(gè)概念跟我們?cè)?C#和 VB 中更簡(jiǎn)單的不可變對(duì)象報(bào)告的記錄提案有很大的重合。MgSam 寫(xiě)道:
該提案似乎與目前的記錄提案完全不相容。我不同意提案中的說(shuō)法,提案提到這比記錄更有用。我認(rèn)為,這可以節(jié)省一些樣板記錄,而記錄(以及自動(dòng)生成 GetHashCode、Equals 和 ToString 相關(guān)的功能)在很多場(chǎng)景中有可能節(jié)約大量模板。
HaloFour 也參與了該話題:
按照為 C#提出的記錄方式,它們包括對(duì)稱構(gòu)造和解構(gòu),以及基于一組特定屬性的識(shí)別。假設(shè)這些參數(shù)也是屬性,那么主構(gòu)造函數(shù)把這些都放在一個(gè)參數(shù)列表中,并且該列表給我們提供了一個(gè)可以解構(gòu)這些屬性的順序。
正如他們所提出的,C#記錄更像 Scala 的 case 類或 F#單例聯(lián)合,并且,這兩種語(yǔ)言都根據(jù)它們的構(gòu)造方式定義構(gòu)造。
總結(jié)
以上是生活随笔為你收集整理的C# 的未来:主构造函数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 前后端分离架构一直没机会实战?1周完成V
- 下一篇: (四)开源C# WPF控件库《AduSk