C# Record關(guān)鍵字示例詳解
在 C# 9.0 中引入了 record
關(guān)鍵字,用于定義記錄類型(Record Types)。記錄類型是一種輕量級(jí)的數(shù)據(jù)載體,專注于表示數(shù)據(jù),它提供了內(nèi)置的相等性比較、生成屬性和方法等功能,使得編寫數(shù)據(jù)類更加簡(jiǎn)潔和高效。
基本概念
- 不可變性:記錄類型默認(rèn)是不可變的,這意味著它們的屬性是只讀的,不能被修改。
- 相等性:記錄類型根據(jù)其值進(jìn)行相等比較,而不是引用比較。
- 自動(dòng)化成員:記錄類型可以自動(dòng)生成構(gòu)造函數(shù)、屬性、
ToString
、Equals
和GetHashCode
方法。
聲明記錄類型
記錄類型的聲明非常簡(jiǎn)潔,基本語法如下:
public record Person(string FirstName, string LastName, int Age);
這會(huì)生成一個(gè)包含 FirstName
、LastName
和 Age
屬性的記錄類型,并自動(dòng)提供構(gòu)造函數(shù)、ToString
、Equals
和 GetHashCode
方法。
不可變性和可變性
不可變記錄:默認(rèn)情況下,記錄類型是不可變的,屬性是只讀的。例如:
public record Person(string FirstName, string LastName, int Age);
可變記錄:可以通過在記錄類型后添加 with
關(guān)鍵字來創(chuàng)建可變記錄,允許修改屬性。例如:
public record Person(string FirstName, string LastName, int Age) with;
構(gòu)造函數(shù)和初始化
記錄類型自動(dòng)生成構(gòu)造函數(shù),可以直接通過屬性初始化:
var person = new Person("John", "Doe", 30);
相等性比較
記錄類型根據(jù)值進(jìn)行相等比較:
var person1 = new Person("John", "Doe", 30); var person2 = new Person("John", "Doe", 30); Console.WriteLine(person1 == person2); // 輸出: True
自定義方法和成員
可以在記錄類型中添加自定義方法和成員:
public record Person(string FirstName, string LastName, int Age) { public string FullName => $"{FirstName} {LastName}"; }
屬性訪問器
默認(rèn)情況下,記錄類型的屬性是只讀的。如果需要自定義屬性行為,可以顯式定義屬性:
public record Person { public string FirstName { get; init; } public string LastName { get; init; } public int Age { get; init; } }
使用 init
訪問器可以在初始化對(duì)象時(shí)設(shè)置值,但之后不能修改。
繼承和派生
記錄類型可以繼承其他記錄類型,派生記錄類型會(huì)繼承基記錄類型的屬性和方法。
public record Person(string FirstName, string LastName, int Age); public record Employee(string FirstName, string LastName, int Age, string EmployeeId) : Person(FirstName, LastName, Age);
使用場(chǎng)景
- 數(shù)據(jù)傳輸對(duì)象(DTO):記錄類型非常適合用來表示數(shù)據(jù)傳輸對(duì)象,因?yàn)樗鼈儗W⒂跀?shù)據(jù)的表示和傳輸。
- 不可變數(shù)據(jù)結(jié)構(gòu):在需要不可變數(shù)據(jù)的情況下,記錄類型提供了方便的不可變性支持。
- 配置對(duì)象:記錄類型可以用來表示應(yīng)用程序的配置選項(xiàng),因?yàn)樗鼈円子趧?chuàng)建和比較。
示例代碼
public record Person(string FirstName, string LastName, int Age) { public string FullName => $"{FirstName} {LastName}"; } class Program { static void Main() { var person1 = new Person("John", "Doe", 30); var person2 = new Person("John", "Doe", 30); var person3 = new Person("Jane", "Doe", 25); Console.WriteLine(person1 == person2); // True Console.WriteLine(person1 == person3); // False Console.WriteLine(person1.FullName); // John Doe } }
到此這篇關(guān)于C# Record關(guān)鍵字的文章就介紹到這了,更多相關(guān)C# Record關(guān)鍵字內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
c# 編寫一個(gè)輕量級(jí)的異步寫日志的實(shí)用工具類(LogAsyncWriter)
這篇文章主要介紹了c# 如何編寫一個(gè)輕量級(jí)的異步寫日志的實(shí)用工具類(LogAsyncWriter),幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下2021-03-03c#使用Unity粒子實(shí)現(xiàn)炮塔發(fā)射系統(tǒng)
Unity自帶粒子發(fā)射器、動(dòng)畫器、渲染器各兩種,利用Unity的粒子系統(tǒng)制作一個(gè)炮塔發(fā)射系統(tǒng),了解粒子系統(tǒng),必須先了解每一個(gè)屬性都代表了什么,之后才能根據(jù)這些原理來調(diào)整出自己滿意的效果2022-04-04C#使用AutoUpdater.NET實(shí)現(xiàn)程序自動(dòng)更新
開發(fā)桌面應(yīng)用程序的時(shí)候,經(jīng)常會(huì)因?yàn)樾略龉δ苄枨蠡蛐迯?fù)已知問題,要求客戶更新應(yīng)用程序,在.Net體系中采用?AutoUpdater.NET?組件可以非常便捷的實(shí)現(xiàn)這一功能,需要的朋友可以參考下2024-02-02c# 如何自己實(shí)現(xiàn)一個(gè)ORM框架
這篇文章主要介紹了c# 如何自己實(shí)現(xiàn)一個(gè)ORM,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下2021-03-03C#中Json字符串的各種應(yīng)用類實(shí)例講解
這篇文章主要介紹了C#中Json字符串的各種應(yīng)用類實(shí)例講解的相關(guān)資料,需要的朋友可以參考下2015-10-10C#實(shí)現(xiàn)在啟動(dòng)目錄創(chuàng)建快捷方式的方法
這篇文章主要介紹了C#實(shí)現(xiàn)在啟動(dòng)目錄創(chuàng)建快捷方式的方法,涉及C#快捷方式的創(chuàng)建技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-09-09C# 使用 WebBrowser 實(shí)現(xiàn) HTML 轉(zhuǎn)圖片功能的示例代碼
這篇文章主要介紹了C# 如何使用 WebBrowser 實(shí)現(xiàn) HTML 轉(zhuǎn)圖片功能,文中示例代碼非常詳細(xì),幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下2020-07-07C# 正則表達(dá)式常用的符號(hào)和模式解析(最新推薦)
這篇文章主要介紹了C# 正則表達(dá)式常用的符號(hào)和模式解析,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-12-12C#中通過API實(shí)現(xiàn)的打印類 實(shí)例代碼
這篇文章介紹了,C#中通過API實(shí)現(xiàn)的打印類 實(shí)例代碼,有需要的朋友可以參考一下2013-08-08