为什么类可以有明确的无参数构造函数但结构不能?

时间:2014-07-29 12:22:01

标签: c# struct constructor

在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()
    {

    }
}

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

杰夫接着说:

  

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

但是,如果将struct替换为class,代码将进行编译,并且在运行时,Point构造函数不会被调用,这对于刚接触编程的人来说可能是意料之外的。

编辑:也许我对它的理解不正确,但我认为杰夫试图说有些人可能会认为如果值类型是无参数构造函数,那么每个人都会调用它Point array = new Point[100];中的实例,这不会发生什么。如果是这样,那么您对引用类型的混淆是否正确?

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

1 个答案:

答案 0 :(得分:0)

事实上,Jon的论点无法应用于参考类型这一事实只会增强他的观点。

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