【问题标题】:C# 9.0 Record constructor with non-nullable property but with default values具有不可为空属性但具有默认值的 C# 9.0 记录构造函数
【发布时间】:2021-10-04 12:53:59
【问题描述】:

我正在尝试为以下内容定义记录类型,而不是作为一个类

public class Contact
{
    public string Name {get;set;}
    public string Email {get;set;}
    public string PhoneNo  {get;set;}
    public DateTime UpdatedAt {get;set;} = DateTime.Now;
}

由于UpdatedAt 是一个不可为空的字段,如果我使用记录的最基本构造函数,我们每次调用记录时都需要传递DateTime.Now。还有其他方法吗?而不是这样做:

public record Contact(string Name, string Email,string PhoneNo, DateTime UpdatedAt);

var records = new Contact("My Name", "a@abc.com", "123456", DateTime.Now)

【问题讨论】:

  • 你想传递什么?
  • records 可以像类构造函数一样具有参数的默认值。它们必须是编译时常量,而DateTime.Now 是运行时值。只需将默认值添加到record 合约,如下所示:public record Contact(string Name, string Email, string PhoneNo, DateTime UpdatedAt = default);
  • @nbokmans 不正确 - 记录的默认参数值必须是编译时常量,不幸的是 DateTime.Now 不是
  • 作为旁注 OP - DateTime.UtcNow 可能也是您想要用于 UpdatedAt 的内容,如果它由于时区复杂性而进入数据库

标签: c# .net .net-core


【解决方案1】:

您可以给record 类型提供一个构造函数,因此添加一个包含所有4 个属性的构造函数,但使DateTime 可以为空并默认为null。如果它为空,则让构造函数使用DateTime.Now。例如:

public record Contact
{
    public Contact(string name, string email, string phoneNo, DateTime? updatedAt = null)
    {
        this.Name = name;
        this.Email = email;
        this.PhoneNo = phoneNo;
        this.UpdatedAt = (updatedAt ?? DateTime.Now);
    }

    public string Name {get;set;}
    public string Email {get;set;}
    public string PhoneNo  {get;set;}
    public DateTime UpdatedAt {get;set;};
}

【讨论】:

  • 我认为您的解决方案基本上是有效的,只是为了补充这一点。要保持记录的不变性,请将所有 { get; set; } 更改为 { get; init; }
猜你喜欢
  • 2010-10-24
  • 1970-01-01
  • 1970-01-01
  • 2021-05-04
  • 1970-01-01
  • 1970-01-01
  • 2017-09-27
  • 2018-04-08
  • 1970-01-01
相关资源
最近更新 更多