在 C# 中,record
和 class
是两种不同的类型。以下是它们之间的一些区别:
- 不可变性:
record
是不可变的,一旦创建就不能修改其属性的值;而class
是可变的,可以随时修改其属性的值。
csharp
record Person
{
public string Name { get; init; }//设置成set可以修改
public int Age { get; init; }
}
class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
- 值语义 vs 引用语义:使用
record
声明的类型是值类型,它们在比较时会比较其属性值;而class
声明的类型是引用类型,它们在比较时比较的是引用地址。
csharp
var person1 = new Person { Name = "Alice", Age = 30 };
var person2 = new Person { Name = "Alice", Age = 30 };
var person3 = person1;
bool isEqual1 = person1 == person2; // false
bool isEqual2 = person1 == person3; // true
- 衍生性:
record
类型默认是密封的,即不能被继承;而class
可以被继承。
csharp
record Person
{
public string Name { get; init; }
public int Age { get; init; }
}
class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
class Employee : Person // 合法
{
public string Department { get; set; }
}
- 默认行为:
record
类型会自动生成适当的Equals
、GetHashCode
和ToString
方法,而class
需要手动实现这些方法。
csharp
record Person
{
public string Name { get; init; }
public int Age { get; init; }
}
class Person
{
public string Name { get; set; }
public int Age { get; set; }
public override bool Equals(object obj)
{
// 实现自定义的相等性比较逻辑
}
public override int GetHashCode()
{
// 实现自定义的哈希码生成逻辑
}
public override string ToString()
{
// 实现自定义的字符串表示形式
}
}
总的来说,record
主要用于表示不可变的数据实体,提供了更多默认行为,而 class
主要用于表示可变的对象,可以被继承和自定义。