【问题标题】:Why we should create default constructor为什么我们应该创建默认构造函数
【发布时间】:2021-03-06 16:35:33
【问题描述】:

我是 C# 新手,我正在遵循课程说明,并创建了一个自定义构造函数来验证数据。

但我想知道:我们为什么要为我们的类创建一个默认构造函数?

这是我的代码:

public class UserNotification
{
    [Key]
    [Column(Order =1)]
    public string UserId { get; set; }

    [Column(Order = 2)]
    [Key]
    public int NotificationId { get; set; }

    public ApplicationUser User { get; set; }

    public Notification Notification { get; set; }

    public bool IsRead { get; set; }

    protected UserNotification(){ }

    public UserNotification(ApplicationUser user, Notification notification)
    {
        if (user == null)
        {
            throw new ArgumentNullException("user");
        }

        if (notification == null)
        {
            throw new ArgumentNullException("notification");
        }

        Notification = notification;
        User = user;
    }
}

【问题讨论】:

  • 因为查询数据库时使用了默认构造函数,并且对象被物化了。查询 db 时,EF 应该将哪些值传递给构造函数?

标签: c# entity-framework oop constructor


【解决方案1】:

为什么要为我们的类创建一个默认构造函数?

没有一般规则,您必须创建一个默认构造函数。但是如果你使用实体框架,你需要一个空的构造函数,因为实体框架需要它。

一般来说,生态系统远离空的默认构造函数。原因是不可为空的属性和不可变的数据结构,但同样 - 截至今天,实体框架不支持这一点。

【讨论】:

    【解决方案2】:

    在这个用例中,定义空构造函数对您是有益的。默认情况下,C# 有一个 public 空构造函数。只需定义一个新的空构造函数即可覆盖此构造函数。

    在这段代码中,您定义了具有protected 访问权限的空构造函数。这(我假设)是因为您不能在没有任何参数的情况下创建上述类的实例。因此,将空构造函数定义为 protected 会禁止任何人隐式构造或构造不带参数的类。

    因此,在这种情况下,这段代码不应该编译,您可以按照自己的方式定义构造函数:

    UserNotification notification = new UserNotification();
    

    但是,如果您没有定义空构造函数,它编译并可能导致未定义的行为。

    【讨论】:

    • 只有当你自己不提供任何构造函数时才会添加默认构造函数
    • @HansKesting 是的,我就是这么说的。
    猜你喜欢
    • 1970-01-01
    • 2021-08-11
    • 2020-02-07
    • 2015-10-18
    • 1970-01-01
    • 1970-01-01
    • 2019-01-25
    • 1970-01-01
    • 2018-10-02
    相关资源
    最近更新 更多