3

我是 C# 新手,正在阅读有关MSDN 上的关键字的文章virtual。在他们的示例代码中,他们创建了以下类:

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

4 回答 4

10

默认情况下,一个类包含一个默认构造函数。当您添加参数化构造函数时,default provided构造函数不再存在。

因此,如果您需要一个无参数构造函数,则需要在添加参数化构造函数后手动添加它。

所以,完全回答你的问题。不,您不必添加默认构造函数。但在这种情况下,该类的作者允许创建一个新Dimensions对象,其中的值默认为0.


作为弗拉德关于序列化的回答的旁注:

如果您只需要一个无参数构造函数来进行序列化,那么很高兴知道您可以将构造函数标记为private(或protected)构造函数。序列化(或者,在这种情况下,反序列化)可以访问private构造函数,而业务逻辑不能。这样您就不必“污染”您的业务逻辑接口。

于 2013-03-03T11:17:51.313 回答
2

你应该总是这样做吗?当然不。如果没有这样的构造函数有效的情况,则不应包含无参数构造函数。

因此,如果您可以设置合理的默认值,并且这看起来很有用,那么请继续创建它。但是,如果没有,请忽略它,以强制客户端提供适当的参数。

请注意,有一些外部因素可能需要无参数构造函数。例如,许多类型的序列化。

于 2013-03-03T11:19:23.450 回答
2

在某些情况下仍然需要没有参数的构造函数(默认构造函数)。其中一种情况是序列化

在此处阅读说明

在对象的反序列化过程中,负责反序列化对象的类创建序列化类的实例,然后仅在获取要填充的实例后才继续填充序列化的字段和属性。

如果需要,您可以将构造函数设为私有或内部,只要它无参数即可。

于 2013-03-03T11:21:22.693 回答
1

当您第一次创建对象(例如 - 序列化)时,您可能不知道这些值是什么或无法设置它们。如果您创建重载构造函数,则不会为您隐式创建默认构造函数 - 因此您需要自己创建它。请参阅: 我们是否应该始终在类中包含默认构造函数?

于 2013-03-03T11:19:51.137 回答