c#笔记-记录

记录

并非所有类型都需要有一定的行为。有很多的数据单纯的只需要存储和展示。
类或结构可以使用record进行修饰,将可以使用主构造器,并自动合成一些成员。

主构造器

记录可以在类名或结构名后面用小括号直接声明一些参数,这就是主构造器。

public record struct Student(string Name, int Age);
public record class Image(string Title, string Url)
{
    
    
	public void Show()
	{
    
    
		Console.WriteLine("Hello");
	}
}

记录可以正常添加其他成员,也可以在声明完主构造器后直接使用分号;结尾。
记录会根据主构造器中的参数自动合成以下成员:

  • 同名的只读属性,具有getinit访问器。
  • ToString方法,输出参数的信息,格式为RecordName(param1, param2, ...)
  • 解构方法,可以把参数解构为元组。
  • 实现IEquatable<T>接口,并根据参数一并重写和重载相等判断。

注意:EqualsGetHashCode==都是用对象特征判断相等的依据,
一般情况下要同时重载重写,并以相同的依据。

更改合成成员

记录可以和记录进行继承,也可以实现接口。
所有记录会自动根据主构造器中的参数合成成员。
如果要改变这些行为,有以下要求或限制:

  • ToStringGetHashCode方法可以手动重写,并且如果使用密封,会阻止派生记录进一步重写。
  • objectEquals方法,==!=不能手动重写。
  • 声明构造器时,必须用构造器链调用或间接调用主构造器。

对于类记录,还会自动合成一个复制构造器,它以自己类型为参数,
会将目标传入的记录中,主构造器对应的合成成员为参数,调用自己的主构造器。
你可以重写这个构造器。

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";
	}
}

猜你喜欢

转载自blog.csdn.net/zms9110750/article/details/130595974