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#,默认的有理数是0/0
,这并不太好。
PS: 默认参数是否能帮助解决C# 4.0的问题,或CLR定义的默认构造函数会被调用?
Jon Skeet回答:
以您的示例为例,当某人执行以下操作时,您想要发生什么:
Rational[] fractions = new Rational[1000];
它应该运行1000次吗?
当然可以,这就是我首先编写默认构造函数的原因。当没有显式默认构造函数时,CLR应该使用默认的清零构造函数;因此您只需为所使用的部分付费。然后,如果我想要一个包含1000个非默认
Rational
的容器(并且想要优化掉这1000个构造),我将使用List<Rational>
而不是数组。在我看来,这个原因还不足以阻止定义默认构造函数。
Rational()
调用了无参构造函数而不是Rational(long num=0, long denom=1)
。 - LaTeXnew Rational()
将调用该构造函数;但是,如果不存在构造函数,则new Rational()
将等同于default(Rational)
。无论如何,建议在您想要使用结构体的“零值”(在您提出的Rational
设计中是一个“坏”的数字)时使用语法default(Rational)
。值类型T
的默认值始终为default(T)
。因此,new Rational[1000]
将永远不会调用结构体构造函数。 - Jeppe Stig Nielsen