8

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

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

所以我的问题是

  • 为什么 C# 设计者会故意偏离 CLI 标准——这样做有什么好处,为什么 CLI 不允许这个功能?
  • 在我有限的经验中,每当我发现自己使用“特殊指令”来实现最初不打算使用的功能时,这通常是一种黑客行为。这有什么不同?
4

3 回答 3

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#有时会根据上下文使用它(有时不使用它) . 有关详细信息,请参阅我的博客条目。

于 2010-08-05T09:46:12.167 回答
0

值类型和类类型之间的一个重要区别是,类类型实例与值类型实例不同,只能通过调用构造函数来实现,并且在构造函数完成或显式暴露之前不会暴露给外界正在建设的对象。相比之下,值类型实例将通过创建具有值类型字段的封闭结构或类类型实例,或通过创建值类型元素数组来实现。虽然微软不允许为结构定义显式无参数构造函数没有任何技术原因,但很难确保每个结构在暴露给外界之前都会运行其无参数构造函数,

于 2012-01-13T21:29:50.187 回答
0

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

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

于 2010-08-05T09:41:42.490 回答