添加没有任何参数的构造函数有什么好处吗?

时间:2013-03-03 11:14:58

标签: c# constructor

我是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;
    }
}

为什么他们添加了第一个构造函数(不需要任何参数的构造函数)?我得到两个双值xy默认为0所以添加这个构造函数不会有害。但我现在已经多次看过这个,因此我想知道是否有任何特殊原因背后总是添加这样的构造函数?我应该经常这样做吗?

4 个答案:

答案 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?