代码之家  ›  专栏  ›  技术社区  ›  DaveDev

C&cli在涉及值类型和构造函数时有什么区别?

  •  8
  • DaveDev  · 技术社区  · 14 年前

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

    根据cli规范,值类型不能有无参数构造函数,而在c规范中,值类型有默认的无参数构造函数。如果根据cli规范,您需要在不指定任何参数的情况下创建一个值,那么有一条特殊的指令来完成这项工作。

    所以我的问题是

    • 为什么C设计师会故意偏离CLI标准-这有什么好处,为什么CLI不允许此功能?
    • 在我有限的经验中,每当我发现自己使用一个“特殊的指令”来允许最初没有打算使用的功能时,通常都是有点黑客行为。这有什么不同?
    3 回复  |  直到 13 年前
        1
  •  7
  •   Jon Skeet    14 年前

    在不同的地方,从 一致性 将值类型视为具有无参数构造函数的观点。您总是可以在不提供任何参数的情况下创建一个值,这在cli和c_中都是正确的。在C中,您只需使用标准构造函数语法:

    int x = new int();
    

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

    注意,对于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 .

        2
  •  0
  •   Richard    14 年前

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

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

        3
  •  0
  •   supercat    13 年前

    值类型和类类型之间的一个重要区别是,与值类型实例不同,类类型实例只能通过调用构造函数来实现,并且在构造函数完成或显式公开正在构造的对象之前,不会向外部世界公开。相比之下,通过使用值类型字段创建封闭结构或类类型实例,或通过创建值类型元素数组,值类型实例将得以存在。虽然没有任何技术上的原因可以解释为什么微软不允许为结构定义显式的无参数构造函数,但要确保每个结构在暴露于外部世界之前都能运行它的无参数构造函数是很困难的,如果有这样一个构造函数R,这会让人困惑。联合国在某些情况下,但不包括其他情况。