C#9新特性init only setter的使用
C# 9 中新支持了 init
關(guān)鍵字,這是一個(gè)特殊的 setter
,用來指定只能在對(duì)象初始化的時(shí)候進(jìn)行賦值,另外支持構(gòu)造器簡(jiǎn)化的寫法,比如:Target-typed new expression
在已知類型的情況下可以使用 new()
來代表構(gòu)造方法的簡(jiǎn)化用法,可以簡(jiǎn)化字段的聲明,也可以簡(jiǎn)化一次聲明多個(gè)相同類型的變量
Sample
來看一個(gè)示例,我們定義一個(gè)測(cè)試用的 Person
類,測(cè)試代碼如下:
public class Person { public int Age { get; init; } public string Name { get; init; } public string Description { get; set; } public override string ToString() { return $"Name:{Name}(Age:{Age})"; } }
init
是一個(gè)特殊的 setter 適用于實(shí)例屬性,被標(biāo)記為 init
的屬性,只能在實(shí)例化的時(shí)候通過初始化器來賦值,實(shí)例化操作完成后不允許再修改值。
var p1 = new Person() { Name = "Michael", Age = 10 }; Console.WriteLine(p1); // compiler error,不能對(duì) init 的字段再賦值 // p1.Age = 12; // Target-Typed new expression, C#9 新特性 Person p2 = new() { Name = "Jane", Age = 10, }, p3 = new() { Name = "Alice" }; Console.WriteLine(p2); Console.WriteLine(p3);
init
的等效寫法,init
類似于 set
,但是 init
對(duì)應(yīng)的字段會(huì)是一個(gè) readonly
的字段,來保證只能在構(gòu)造器中或者初始化器中被賦值,另外編譯器會(huì)做檢查如果是 init
,會(huì)有一個(gè)特殊的標(biāo)識(shí),在初始化后再賦值的時(shí)候就會(huì)報(bào)錯(cuò),類似于下面這樣:
internal class TestInitModel { private readonly string _name; public string Name { get => _name; init => _name = value; } }
我們以上面的 Person
為例來看一下生成 IL 代碼的區(qū)別:
可以看到聲明為 init
的 屬性會(huì)比普通的 set
多出來一個(gè)修飾符,這是由編譯器去生成的,編譯器也會(huì)根據(jù)此去判斷是否是在初始化的時(shí)候賦值,如果不是就會(huì)報(bào)錯(cuò)。
序列化是否會(huì)有問題呢,我們來測(cè)試一下,可以看到 model1
是被正常賦值(這里的 ToJson
/JsonToObject
是基于 Newtonsoft.Json
的 JsonConvert
封裝的擴(kuò)展方法)
More
我覺得 init
為我們帶來的好處在于,可以在初始化的時(shí)候賦值而非直接通過構(gòu)造器賦值,如果希望一個(gè)屬性只能 get
,不在初始化之外的地方被賦值,之前我的做法都是在構(gòu)造器里初始化,只保留一個(gè) getter
,沒有 setter
,有了這個(gè)支持之后就可以不需要修改構(gòu)造方法比較方便的使用了
Reference
https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-9
https://github.com/WeihanLi/SamplesInPractice/tree/master/CSharp9Sample
https://github.com/WeihanLi/SamplesInPractice/blob/master/CSharp9Sample/InitOnlySample.cs
到此這篇關(guān)于C#9新特性init only setter的使用的文章就介紹到這了,更多相關(guān)C#9 init only setter內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#使用whisper.net實(shí)現(xiàn)語音識(shí)別功能
這篇文章主要為大家詳細(xì)介紹了C#如何使用whisper.net實(shí)現(xiàn)語音識(shí)別功能,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以學(xué)習(xí)一下2023-11-11使用C#實(shí)現(xiàn)網(wǎng)頁內(nèi)容保存為圖片并生成壓縮包
這篇文章主要為大家詳細(xì)介紹了如何使用C#實(shí)現(xiàn)網(wǎng)頁內(nèi)容保存為圖片并生成壓縮包,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-02-02基于C#實(shí)現(xiàn)的屏幕指定區(qū)域截屏代碼
這篇文章主要介紹了C#實(shí)現(xiàn)的屏幕指定區(qū)域截屏代碼,有需要的朋友可以參考一下2014-01-01C# winfrom 模擬ftp文件管理實(shí)現(xiàn)代碼
從網(wǎng)上找到的非常好用的模擬ftp管理代碼,整理了一下,希望對(duì)需要的人有幫助2014-01-01C# 創(chuàng)建MDB數(shù)據(jù)庫、并存放表格數(shù)據(jù)的案例
這篇文章主要介紹了C# 創(chuàng)建MDB數(shù)據(jù)庫、并存放表格數(shù)據(jù)的案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-01-01