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)潔,基本語(yǔ)法如下:
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);
可變記錄:可以通過(guò)在記錄類型后添加 with 關(guān)鍵字來(lái)創(chuàng)建可變記錄,允許修改屬性。例如:
public record Person(string FirstName, string LastName, int Age) with;
構(gòu)造函數(shù)和初始化
記錄類型自動(dòng)生成構(gòu)造函數(shù),可以直接通過(guò)屬性初始化:
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}";
}屬性訪問(wèn)器
默認(rèn)情況下,記錄類型的屬性是只讀的。如果需要自定義屬性行為,可以顯式定義屬性:
public record Person
{
public string FirstName { get; init; }
public string LastName { get; init; }
public int Age { get; init; }
}使用 init 訪問(wèn)器可以在初始化對(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):記錄類型非常適合用來(lái)表示數(shù)據(jù)傳輸對(duì)象,因?yàn)樗鼈儗W⒂跀?shù)據(jù)的表示和傳輸。
- 不可變數(shù)據(jù)結(jié)構(gòu):在需要不可變數(shù)據(jù)的情況下,記錄類型提供了方便的不可變性支持。
- 配置對(duì)象:記錄類型可以用來(lái)表示應(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# 數(shù)據(jù)類型占用的字節(jié)數(shù)介紹
本篇文章主要是對(duì)c#中數(shù)據(jù)類型占用的字節(jié)數(shù)進(jìn)行了詳細(xì)的介紹。需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助2014-01-01
一個(gè)狀態(tài)機(jī)的實(shí)現(xiàn)
本文主要介紹了C#實(shí)現(xiàn)一個(gè)狀態(tài)機(jī)的思路與方法,具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧2017-02-02
C#的靜態(tài)工廠方法與構(gòu)造函數(shù)相比有哪些優(yōu)缺點(diǎn)
這篇文章主要介紹了C#的靜態(tài)工廠方法與構(gòu)造函數(shù)對(duì)比的優(yōu)缺點(diǎn),文中示例代碼非常詳細(xì),幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下2020-07-07
C#使用CefSharp實(shí)現(xiàn)內(nèi)嵌網(wǎng)頁(yè)詳解
這篇文章主要介紹了C# WPF里怎么使用CefSharp嵌入一個(gè)網(wǎng)頁(yè),并給出一個(gè)簡(jiǎn)單示例演示C#和網(wǎng)頁(yè)(JS)的交互實(shí)現(xiàn),感興趣的小伙伴可以了解一下2023-04-04
C#程序調(diào)用C++動(dòng)態(tài)庫(kù)(dll文件)遇到的坑及解決
這篇文章主要介紹了C#程序調(diào)用C++動(dòng)態(tài)庫(kù)(dll文件)遇到的坑及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08
C# 利用AForge實(shí)現(xiàn)攝像頭信息采集
這篇文章主要介紹了C# 如何利用AForge實(shí)現(xiàn)攝像頭信息采集,文中示例代碼非常詳細(xì),幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下2020-07-07

