导读:本期聚焦于小伙伴创作的《C#中的Record类型有什么优势?C# 9新特性Record与Class的用法区别》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《C#中的Record类型有什么优势?C# 9新特性Record与Class的用法区别》有用,将其分享出去将是对创作者最好的鼓励。

C# 9引入的Record类型是一种特殊的引用类型,主要用于存储不可变的数据载体,它在设计上和传统的Class有明显差异,也带来了很多独有的优势。Record的核心设计目标是简化数据类的编写,减少样板代码,同时提供更适合数据场景的特性。

C#中的Record类型有什么优势?C# 9新特性Record与Class的用法区别

Record类型的核心优势

1. 自动实现值相等性

传统的Class默认使用引用相等性,判断两个对象是否相等时比较的是引用地址,而Record默认实现值相等性,只要两个Record对象的所有属性值都相同,就会判定为相等。这不需要开发者手动重写EqualsGetHashCode方法,减少了重复代码。

2. 简洁的语法定义

Record支持位置参数语法,只需要一行代码就可以定义包含多个属性的数据载体,编译器会自动生成对应的属性、构造函数、解构方法等,比传统Class的定义方式简洁很多。

3. 内置不可变特性支持

Record默认的属性是init-only的,只能在对象初始化时赋值,之后无法修改,天然适合存储不可变数据,避免了意外修改数据带来的问题,也更符合函数式编程的思想。

4. 方便的复制修改能力

Record支持with表达式,可以快速创建一个和原有对象属性大部分相同,仅部分属性不同的新对象,不需要手动编写复制构造函数或者逐个赋值属性。

Record与Class的用法区别

定义方式差异

Class需要手动定义属性、构造函数,而Record可以用简洁的位置参数或者普通属性语法定义。下面是两者的定义示例:

// Class定义示例
public class PersonClass
{
    public string Name { get; set; }
    public int Age { get; set; }

    public PersonClass(string name, int age)
    {
        Name = name;
        Age = age;
    }
}

// Record位置参数定义示例
public record PersonRecord(string Name, int Age);

// Record普通属性定义示例
public record PersonRecord2
{
    public string Name { get; init; }
    public int Age { get; init; }
}

相等性判断差异

Class的==Equals默认比较引用地址,Record默认比较属性值。示例如下:

var class1 = new PersonClass("张三", 20);
var class2 = new PersonClass("张三", 20);
Console.WriteLine(class1 == class2); // 输出 False,引用不同
Console.WriteLine(class1.Equals(class2)); // 输出 False

var record1 = new PersonRecord("张三", 20);
var record2 = new PersonRecord("张三", 20);
Console.WriteLine(record1 == record2); // 输出 True,属性值相同
Console.WriteLine(record1.Equals(record2)); // 输出 True

属性修改方式差异

Class的属性如果是可读可写的,可以直接修改;Record的属性默认是init-only,不能直接修改,需要使用with表达式创建新对象。示例如下:

// Class修改属性
var personClass = new PersonClass("张三", 20);
personClass.Age = 21; // 可以直接修改

// Record修改属性
var personRecord = new PersonRecord("张三", 20);
// personRecord.Age = 21; 这行会编译报错,属性不可修改
var newPersonRecord = personRecord with { Age = 21 }; // 创建新对象,Age改为21
Console.WriteLine(newPersonRecord.Name); // 输出 张三
Console.WriteLine(newPersonRecord.Age); // 输出 21

继承特性差异

Class支持任意继承,Record也支持继承,但是Record的继承有一些限制:Record只能继承自其他Record,不能继承自Class,也不能被Class继承。示例如下:

// Record继承示例
public record StudentRecord(string Name, int Age, string School) : PersonRecord(Name, Age);

var student = new StudentRecord("李四", 18, "XX中学");
var person = (PersonRecord)student; // 可以向上转型
Console.WriteLine(person.Name); // 输出 李四

适用场景选择

如果场景是存储不可变的数据载体,需要频繁比较属性值是否相同,或者需要快速复制修改对象,优先选择Record。如果是需要频繁修改属性,或者需要复杂的继承层次、实现更多的业务逻辑方法,优先选择Class。

对比维度RecordClass
相等性默认实现值相等性引用相等性
属性可变性默认init-only,不可变可按需定义为可读可写
定义简洁度高,支持位置参数低,需要手动编写较多代码
复制修改支持原生支持with表达式需要手动实现
继承限制只能继承Record可继承Class,可被Class继承

C#_RecordClass值相等性不可变类型引用类型修改时间:2026-06-14 12:00:17

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。