默认构造函数是为“Class”和“Struct”定义的。但是如果我声明一个只有一个构造函数的类“Point”,并且它也是一个参数化的类,编译器就不允许我写
Point p = new Point()
但是,如果我有一个结构“Point”,它只有1个参数化构造函数,编译器将允许我写
Point p = new Point()
我问的问题是为什么编译器允许struct创建一个对象并停止该类来创建一个对象?
注意:我在C#6上编写此代码
答案 0 :(得分:0)
因为struct
是值类型,所以它的默认值不是null,就像引用类型一样,但是一个实例,其所有成员都设置为默认值。
因此,即使您只允许调用参数化构造函数,您仍然可以创建一个默认实例,这与使用默认构造函数创建结构完全相同。
例如,给定这个结构:
public struct Point
{
public int X { get; private set; }
public int Y { get; private set; }
public Point(int x, int y)
{
X = x;
Y = y;
}
}
即使你不能这样做:
var p = new Point();
你仍然可以这样做:
var p = default(Point);
如果Point
是一个类,这将无法为您提供实例,它会让您null
。但是使用结构可以获得一个实例。
因此,没有理由阻止使用默认构造函数,并且假装您无法创建默认实例。
答案 1 :(得分:-1)
您可以在MSDN上找到您的问题(为什么没有编译错误)的答案:
在C#中,类和结构在语义上是不同的。
结构体不能声明默认构造函数(没有构造函数) 参数)或析构函数。
每个值类型都有一个隐式默认构造函数,用于初始化该类型的默认值。有关默认值的信息 值类型,请参见默认值表。
(https://docs.microsoft.com/en-us/dotnet/articles/csharp/language-reference/keywords/value-types)
答案 2 :(得分:-1)
使用类时,可以定义是否可以以任何特定方式初始化其对象。 但是,当涉及到struct时,应始终能够在没有参数的情况下进行初始化。
最好的例子是,当你无法以指定的方式初始化类时,可以用null
初始化类,而结构体没有这样的选项。但结构可以用default
关键字初始化,它基本上调用无参数构造函数。
<强>编辑:强>
虽然我在概述struct
作为valuetype的通用规则,但实际上有几种方法可以使用struct
初始化null
(或模拟它)。当然,最常见的是Nullable<>
,对大多数(如果不是全部)目的而言,这已经足够了。对于那些对其工作原理感到好奇的人以及将null
设置为struct
的其他方式,我建议 C#in Depth :第4章。说 Jon Skeet 中没有任何可以为空的类型。可以找到其他信息here。