在.NET中,值类型(C#struct
)不能具有没有参数的构造函数。根据这篇文章,这是CLI规范要求的。发生的情况是,对于每个值类型,都会创建一个默认的构造函数(由编译器生成?),该构造函数将所有成员初始化为零(或null
)。
为什么不允许定义这样的默认构造函数?
琐碎的用途是有理数:
public struct Rational {
private long numerator;
private long denominator;
public Rational(long num, long denom)
{ /* Todo: Find GCD etc. */ }
public Rational(long num)
{
numerator = num;
denominator = 1;
}
public Rational() // This is not allowed
{
numerator = 0;
denominator = 1;
}
}
使用当前版本的C#,默认的Rational 0/0
不是那么酷。
PS:默认参数是否可以帮助解决C#4.0的问题,还是将调用CLR定义的默认构造函数?
以您的示例为例,当某人这样做时,您希望发生什么:
Rational[] fractions = new Rational[1000];
它应该在构造函数中运行1000次吗?
当然应该,这就是为什么我首先编写默认构造函数的原因。当未定义显式默认构造函数时,CLR应该使用默认清零构造函数;这样,您只需为使用的商品付费。然后,如果我想要一个1000个非默认值Rational
的容器(并且想优化掉1000个结构),我将使用List<Rational>
而不是一个数组。
我认为,此原因不足以阻止定义默认构造函数。
Rational()
调用无参数ctor而不是Rational(long num=0, long denom=1)
。
new Rational()
将调用构造函数(如果存在),但是如果不存在,new Rational()
将等效于default(Rational)
。无论如何,都鼓励default(Rational)
您在想要结构的“零值”(建议的设计为“坏”数字Rational
)时使用语法。值类型的默认值T
始终为default(T)
。因此new Rational[1000]
永远不会调用struct构造函数。
denominator - 1
在结构体中,以便默认值变为0/1
Then if I want a container of 1000 non-default Rationals (and want to optimize away the 1000 constructions) I will use a List<Rational> rather than an array.
您为什么期望数组调用与结构的List不同的构造函数?