在里面NET中,值类型(C#struct
)不能有没有参数的构造函数.根据this post,这是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: Will default parameters help solve this for C# 4.0 or will the CLR-defined default constructor be called?
Jon Skeet人回答:
举个例子,如果有人这样做了,你希望发生什么:
Rational[] fractions = new Rational[1000];
它应该在构造函数中运行1000次吗?
当然应该,这就是为什么我首先编写默认构造函数的原因.当没有定义显式默认构造函数时,CLR应该使用default zeroing构造函数;这样你只需为你使用的东西付费.如果我想要Rational
0个非默认的Rational
个容器(并且想要优化掉Rational
0个 struct ),我将使用List<Rational>
而不是array.
在我看来,这个原因不足以阻止定义默认构造函数.