记录
并非所有类型都需要有一定的行为。有很多的数据单纯的只需要存储和展示。
类或结构可以使用record
进行修饰,这会基于主构造器中的参数自动合成一些成员。
- 自动生成和主构造器参数同名的具有
get
和init
访问器的属性。 ToString
方法,输出参数的信息,格式为RecordName(param1, param2, ...)
。- 解构方法,可以把参数解构为元组。
- 实现
IEquatable<T>
接口,并根据参数一并重写和重载相等判断。
更改合成成员
记录可以和记录进行继承,也可以实现接口。
所有记录会自动根据主构造器中的参数合成成员。
如果要改变这些行为,有以下要求或限制:
ToString
和GetHashCode
方法可以手动重写,并且如果使用密封,会阻止派生记录进一步重写。object
的Equals
方法,==
,!=
不能手动重写。- 声明构造器时,必须用构造器链调用或间接调用主构造器。
对于类记录,还会自动合成一个复制构造器,它以自己类型为参数,
会将目标传入的记录中,主构造器对应的合成成员为参数,调用自己的主构造器。
你可以重写这个构造器。
public record class Announcement(string Author, DateTime Date, string Title, string ContentUrl)
{
public sealed override string ToString()
{
return $"Announcement({Author}, {Date:O}, {Title}, {ContentUrl})";
}
// 定义一个ShowContent方法,用于打开正文链接
public void ShowContent()
{
Console.WriteLine($"尝试链接{ContentUrl},链接失败。");
}
// 重写复制构造器,改为调用base()
public Announcement(Announcement other) : base()
{
// 在自己的复制构造器里写复制逻辑
Title = other.Title + " (Copy)";
ContentUrl = other.ContentUrl + "?copy=true";
}
}