2010-08-05 68 views
8

我最近读到C#和CLI标准定义了处理值类型和构造函数的不同方法。C#&CLI与值类型和构造函数有什么区别?

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

所以我的问题是

  • 为什么C#的设计者有意从CLI标准偏差 - 什么好处在那里这一点,为什么不CLI允许这种功能?
  • 在我有限的经验中,任何时候当我发现自己使用'特殊指令'来允许最初并不打算使用的功能时,它通常都是一些黑客行为。这有什么不同?
+0

您是否使用Reflector查看过代码? – 2010-08-05 09:41:32

+0

不,我没有任何特定的代码来看待,因为我将这个问题的基础是我读的东西 – DaveDev 2010-08-05 09:48:47

+0

出于兴趣,你在哪里读过它?我知道这是我已经指出的几次,但我没有看到很多其他人提到它。 – 2010-08-05 09:49:36

回答

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

0

而在C#规格值类型都有一个默认参数的构造函数

那你不能改变。所以效果是一样的,只是有不同的定义。

0

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

相关问题