【发布时间】:2016-06-02 03:31:10
【问题描述】:
我是一名非常新的程序员,并且了解我们希望最大限度地减少代码冗余,因此当我们更新时,我们可以尽可能少地进行更改并最大限度地减少错误。
所以我有一个 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;
但这显然很糟糕,因为我们想要一个构造函数中的所有代码是什么原因?易于阅读?
public Student() : this(null, 0)
{ }
public Student(string name) : this(name, 0)
{ }
public Student(string name, int Id)
{
this.name = name;
this.Id = Id;
}
如果我执行此前向链接,那么如果我们添加一个新字段(如字符串专业)会发生什么?如果我进行前向链接,那么我将创建一个带有添加字段的新重载构造函数。但是现在我必须更改所有其他构造函数来调用新的构造函数。如果我进行反向链接,我只需创建一个新的构造函数并调用前一个重载的构造函数。
public Student(string name, int Id, string major):this(name, Id)
{
this.major=major;
}
这似乎更好地遵循 OOP,但我教科书中的所有示例都显示了前向链接,并没有说明为什么我不应该使用后向链接。
如果我使用命名/可选参数,那就更容易了。
public Student(string name = null, int Id = 0, string major = null)
{
this.name = name;
this.Id = Id;
this.major = major;
}
如果我需要另一个字段,我只需要编辑唯一的构造函数。这似乎最好遵循 OOP 原则,还是我弄错了?它至少最大程度地消除了代码重复。我的任务是“按照 OOP 的原则实施学生课程”。我知道所有这些都是有效的,但这是编码构造函数的最佳/公认方式之一吗?我缺少的命名/可选参数是否存在缺点?作为一个初学者,有这么多的方式来编写这个代码是非常令人困惑的。
【问题讨论】:
-
链式构造函数在 C# 之前 可选项中被广泛使用,可选项是在 C# 3.0 中添加的,因此您可以阅读的很多信息仍然使用它们,因为它们是旧信息,但今天,带有可选参数,如果在链上你只是传递默认值,链式构造函数就失去了意义。
-
古斯曼所说的。此外,您可以一次向前链一步:
public Student() : this(null) {}而不是public Student() : this(null, 0) {}。 (尽管如果您有两个采用单个可为空参数的构造函数,这可能会变得模棱两可)。这样,您只需在添加新字段时更改链中的最后一个 c'tor。
标签: c# parameters constructor chaining named