为什么类可以有显式无参数构造函数,而结构却不能

本文关键字:构造函数 结构 不能 参数 为什么 | 更新日期: 2023-09-27 18:15:18

在CLR Via c#第4版的第185/186页,它有这个代码示例:

class Program
{
    static void Main(string[] args)
    {
        Rectangle r = new Rectangle();
    }
}
internal struct Point
{
    public Int32 m_x, m_y;
    public Point()
    {
        m_x = m_y = 5;
    }
}
internal sealed class Rectangle
{
    public Point m_topLeft, m_bottomRight;
    public Rectangle()
    {
    }
}

这将无法编译,因为您不能为结构定义无参数构造函数。

Jeff接着说:

c#故意不允许值类型定义无参数构造函数,以消除开发人员对何时调用该构造函数可能产生的任何混淆。

但是,如果您将struct替换为class,则代码会编译,并且在运行时不会调用Point构造函数,这对于编程新手来说可能是意想不到的。

EDIT:也许我理解得不正确,但我认为Jeff试图说有些人可能会认为,如果值类型有一个无参数构造函数,它将被Point array = new Point[100];中的每个实例调用,这不是会发生的事情。如果是这样,那么您可能会对引用类型产生同样的混淆,对吗?

我知道Jon Skeet在这里写了一个答案,但是所有这些点也可以应用于引用类型,但是引用类型允许无参数构造函数

为什么类可以有显式无参数构造函数,而结构却不能

事实上,Jon的参数不能应用于引用类型这一事实只会加强他的观点。

如果在初始化引用类型数组时从未调用引用类型的构造函数(因为没有任何东西被实例化),那么只有在初始化值类型数组时保持行为一致并且调用任何构造函数才有意义。