构造函数链接或使用命名/可选参数

joh*_*ens 5 c# parameters constructor named chaining

我是一个非常新的程序员,并且了解到我们希望最大程度地减少代码冗余,因此在我们进行更新时,我们可以进行尽可能少的更改,并最大程度地减少错误。

所以我有一个Student类,我想重载构造函数,所以如果我进行反向链接,它就是这样。

 public class Student
{
    string name;
    int Id;

    public Student()
    {
    }
    public Student(string name)
    {
        this.name = name;
    }
    public Student(string name, int Id) :this(name)
    {
        this.Id = Id;
Run Code Online (Sandbox Code Playgroud)

但这显然是不好的,因为出于某种原因我们希望所有代码都在一个构造函数中?易于阅读?

    public Student() : this(null, 0)
    { }
    public Student(string name) : this(name, 0)
    { }
    public Student(string name, int Id) 
    {
        this.name = name;
        this.Id = Id;
    }
Run Code Online (Sandbox Code Playgroud)

如果我进行前向链接,那么如果我们添加一个新的字段(例如字符串major)会怎样?如果我进行正向链接,则会使用添加的字段创建一个新的重载构造函数。但是现在我必须更改所有其他构造函数以调用新的构造函数。如果我进行反向链接,则只需创建一个新的构造函数并调用先前的重载构造函数即可。

    public Student(string name, int Id, string major):this(name, Id)
    {
        this.major=major;
    } 
Run Code Online (Sandbox Code Playgroud)

这似乎更好地遵循了OOP,但是我的教科书中的所有示例都显示了正向链接,并且没有说为什么不应该使用反向链接。

如果我使用命名/可选参数,则更加简单。

    public Student(string name = null, int Id = 0, string major = null)
    {
        this.name = name;
        this.Id = Id;
        this.major = major;
    }
Run Code Online (Sandbox Code Playgroud)

如果我需要另一个字段,我只需要编辑一个唯一的构造函数。这似乎最好地遵循了OOP原则,还是我误会了?至少可以最大程度地消除代码重复。我的任务是“按照OOP原则实施学生班”。我知道所有这些都是有效的,但是是编码构造函数的最佳/可接受方法之一吗?我缺少命名/可选参数的缺点吗?作为一个初学者,令人困惑的是有很多方法可以对此进行编码。

Ala*_*own 1

我知道所有这些都是有效的,但这是编码构造函数的最佳/可接受的方式之一吗?

据我所知,您有很多选择。您的同事是达成共识的最佳交谈对象。C# 正在成为一种非常丰富的语言,这意味着将有许多不同的方法来实现同一件事。

我缺少的命名/可选参数是否有缺点?

据我所知并非如此。我个人认为这是最好的解决方案,但其他解决方案可能有所不同。

作为一个初学者,有这么多的方法来编写这个代码是非常令人困惑的。

欢迎来到编程。我们有数百万程序员,我们都在忙着给世界增加复杂性!