最佳答案
在. net中,值类型(c# struct
)不能有不带形参的构造函数。根据这篇文章,这是CLI规范强制要求的。实际情况是,对于每一个值类型都创建一个默认构造函数(由编译器创建?),该构造函数将所有成员初始化为0(或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定义的默认构造函数将被调用?
Jon双向飞碟回答:
用你的例子来说,如果有人这么做了,你希望发生什么:
Rational[] fractions = new Rational[1000];
它应该遍历构造函数1000次吗?
当然应该,这就是为什么我首先写默认构造函数的原因。当没有定义显式默认构造函数时,CLR应该使用默认归零构造函数;这样你只需要为你所使用的付费。然后,如果我想要一个包含1000个非默认__abc0的容器(并想优化掉这1000个结构),我将使用List<Rational>
而不是数组。
在我看来,这个原因还不足以阻止定义默认构造函数。