具有多个构造函数的记录类型

43

我如何在C#中为记录类型创建多个构造函数

我创建了一个类似这样的记录类型:

public record Person(int Id, string FirstName, string LastName)

现在我想介绍另一个没有参数的构造函数重载,我该怎么做呢? 在普通类中,我会这样做:

现在我想介绍另一个没有参数的构造函数重载,我该怎么做呢? 在普通类中,我会这样做:

public class Person
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }

    public Person()
    {
        
    }

    public Person(int id, string firstName, string lastName)
    {
        Id = id;
        FirstName = firstName;
        LastName = lastName;
    }
}

https://www.claudiobernasconi.ch/2020/11/07/csharp-9-record-types-introduction-and-deep-dive/...请查看标题为“定义记录类型的替代语法”的部分...其中有一些有趣的解释...在记录类型中,始终必须初始化所有参数。否则,您只能使用类。 - Akshay G
6个回答

52

只需像这样添加您想要的构造函数:

record Rank(int level, string description);

record Manager(string FirstName, Rank Rank) {
  public Manager() : this("", new Rank(0, "Entry")) { }

  // public Manager(string FirstName, Rank Rank) is auto generated
}
                          

16

您可以像下面这样编写代码:

public record Person
{
    public int Id { get; init; }
    public string FirstName { get; init; }
    public string LastName { get; init; }
    //constructor
    public Person()
    {
        //init or do something
    }
    //overload constructor
    public Person(int id, string firstName, string lastName)
    {
        Id = id;
        FirstName = firstName;
        LastName = lastName;
    }
}

8

使用可选参数。

public record Person(int Id = default, string FirstName = null, string LastName = null);

2
它并没有真正解决创建重载的问题。如果我需要3个构造函数会发生什么? - Nadar
1
它可以解决你的问题,因为记录旨在在初始化阶段设置字段。你应该像这样设置字段 new Person(){ FirstName="Nadar" }。否则,请使用一个类。 - Mustafa Arslan
1
如果我的一个属性是 string[],而我不希望它为空怎么办?这个解决方案并没有涵盖到这一点。而且创建一个类并不是一个解决方案,因为你会失去很多本地功能。所以我不接受这个答案。 - Ristogod

6

你可以这样写:

public record Person(int Id,string FirstName,string LastName){
   public Person(YourDto item):this(item.Id,item.FirstName,item.LastName){} 
}

因此,在构造函数中,您可以传递您的DTO项。


0

当您有一个基础记录时,也可以像这样扩展:

public record Person
{
    public Person(Guid? id = null) { }
}

public record Teacher : Person
{
    public Teacher(Guid id) : base(id) { }
    public Teacher(string firstName, string lastName) : base() { }
}

0
以下示例通过一个无法使用编译时常量初始化的默认参数来扩展记录。
public record Person(string FirstName, string LastName)
{
    public string[] Aliases = new string[0];

    public Person(string firstName, string lastName, string[] aliases)
        : this(firstName, lastName)
    {
        Aliases = aliases;
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接