有什么区别C#& CLI何时带有值类型和构造函数?

时间:2010-08-05 09:31:41

标签: c# .net constructor command-line-interface value-type

我最近读到C#和CLI标准定义了处理值类型和构造函数的不同方法。

根据CLI规范,值类型不能具有无参数构造函数,而在C#规范中,值类型具有默认的无参数构造函数。如果根据CLI规范,您需要在不指定任何参数的情况下创建值,那么可以使用特殊指令来执行此操作。

所以我的问题是

  • 为什么C#设计师会故意偏离CLI标准 - 有什么好处呢?为什么CLI不允许这个功能呢?
  • 在我有限的经验中,任何时候我发现自己使用“特殊指令”来允许最初没有预期的功能,这通常是一个黑客攻击。这有什么不同?

3 个答案:

答案 0 :(得分:7)

在各个地方,从一致性的角度来看,将值类型视为具有无参数构造函数是有意义的。您始终可以在不提供任何参数的情况下创建值,这在CLI和C#中都是如此。在C#中,您可以使用标准构造函数语法:

int x = new int();

而不是有一种语法和调用“真正的”构造函数的不同语法。

请注意,从C#2开始,有一个默认值运算符,我认为可以代替它:

int x = default(int);

真的,感觉更接近于IL。我想如果我们开始使用它,那么C#就不可能“假装”所有值类型都具有无参数构造函数。

另一方面,考虑泛型:

public void Foo<T>() where T : new()
{
    T t = new T();
}

是否应该允许值类型? - 但如果C#不允许new int()那么以通用形式允许它就没有多大意义......

您可能希望更深入地了解一个有趣的观点 - 尽管C#不允许您定义自定义值类型无参数构造函数,但您可以在IL中执行此操作,而C#将有时使用它(有时不是)取决于上下文。请参阅my blog entry for more details

答案 1 :(得分:0)

  

而在C#规范中,值类型具有默认的无参数构造函数

你无法改变。所以效果是一样的,只是定义不同。

答案 2 :(得分:0)

值类型和类类型之间的一个重要区别是类型类型实例与值类型实例不同,只能通过调用构造函数来实现,并且在构造函数完成之前不会暴露给外部世界。或明确公开正在构建的对象。相比之下,值类型实例将通过创建带有值类型字段的封闭结构或类型实例或通过创建值类型元素数组来实现。虽然没有任何技术上的原因导致微软不能允许为结构体定义显式无参数构造函数,但是很难确保每个结构体在暴露给外部世界之前运行其无参数构造函数,如果在某些情况下运行这样的构造函数而在其他情况下运行会很困惑。