我是C#的新手,正在阅读the article about the virtual
keyword at the MSDN。在他们的示例代码中,他们创建了以下类:
public class Dimensions
{
protected double x, y;
public Dimensions()
{
}
public Dimensions(double x, double y)
{
this.x = x;
this.y = y;
}
public virtual double Area()
{
return x * y;
}
}
为什么他们添加了第一个构造函数(不需要任何参数的构造函数)?我得到两个双值x
和y
默认为0所以添加这个构造函数不会有害。但我现在已经多次看过这个,因此我想知道是否有任何特殊原因背后总是添加这样的构造函数?我应该经常这样做吗?
答案 0 :(得分:10)
默认情况下,类包含默认构造函数。添加参数化构造函数时,default provided
构造函数不再存在。
因此,如果你需要一个无参数构造函数,你需要手动添加它,一旦你添加了参数化构造函数。
所以,完全回答你的问题。不,您不必添加默认构造函数。但在这种情况下,该类的作者允许创建一个新的Dimensions
对象,其值默认为0
。
作为弗拉德关于序列化的答案的旁注:
如果您只需要一个无参数构造函数用于序列化,那么最好知道可以将构造函数标记为private
(或protected
)构造函数。序列化(或者,在这种情况下反序列化)可以访问private
构造函数,而业务逻辑则不能。这样,您就不必“污染”面向业务逻辑的界面。
答案 1 :(得分:2)
你总是这样做吗?当然不。当没有这种构造函数有效的情况时,你不应该包含无参数构造函数。
因此,如果您可以设置合理的默认设置,这似乎很有用,那么继续创建它。如果没有,将其留下,以强制客户提供适当的参数。
请注意,有些外部因素可能需要无参数构造函数。例如,许多类型的序列化。
答案 2 :(得分:2)
在某些情况下,仍然需要没有参数的构造函数(默认构造函数)。其中一个案例是serialization。
阅读解释here
在对象的反序列化期间,负责的类 反序列化对象会创建序列化类的实例 然后继续填充序列化的字段和属性 只有在获得填充实例后才能填充。
如果需要,您可以将构造函数设置为私有或内部,就这样 只要它无参数。
答案 3 :(得分:1)
首次创建对象时,您可能不知道值是什么或不能设置它们(例如 - 序列化)。 如果您创建了重载的构造函数,则不会隐式为您创建默认的construcotr - 因此您需要自己创建它。看到: Should we always include a default constructor in the class?