3
using System;

namespace FirstApplication
{
    class Program
    {
        static void Main(params string[] args)
        {
            int x = new int();
            x = 12;
            //int y = new int(12);
            Console.WriteLine(x);
        }
    }
}

按照设计,为什么没有一个参数 ctorint可以x设置为 12 而不必先设置为 0?

4

3 回答 3

7

原因在于CLR本身。CLR 不将Int32其视为任何普通结构。它有一个特殊的存储类型int,它不是 CLR 对象。这意味着它不需要构造函数,就像intC 中的 an 没有构造函数一样。

此外,结构默认构造函数的 CLR 处理是将所有字段设置为其默认值。对于 int,这是 0。new int()似乎是一种特殊情况,只是作为 0 的“别名”,完全消除了任何构造函数。

另外,这只是更好。

int x = 12;
于 2012-06-22T11:28:04.657 回答
5

这是不必要的 - 我更喜欢:

int x = 12;

int x = new int(12);

提供了无参数构造函数,因为int它是一个struct,我从未见过任何实际显式使用它的生产代码。

于 2012-06-22T11:26:28.447 回答
1

规范没有要求

结构可以声明具有参数的实例构造函数。

不是 必须的;因此,提供带参数的构造函数完全是可选的。设计师选择不这样做,所以给他们更多的权力;-)

还有什么其他原因?

简化设计?

让我们想象一下,框架设计者决定提供一个构造函数:

int myInt = new int(99999999999999999999999999999999999);

构造函数的复杂性现在增加了。为避免溢出错误,需要检查所提供值的范围。

所以简化也是反对提供构造函数的论据。

该规范还定义了“ simple-types ”的默认值。对于 int,它是 0。正如@KendallFrey 所提到的,有可能对整数的实例化进行了优化,但是,它们确实一个构造函数——一个将值初始化为 0 的隐式默认构造函数。 IIRC(我会看看我是否可以挖掘它稍后出),简单类型实际上是由内存管理器实例化的。此处的其他构造函数逻辑也可能使问题复杂化。

执行语义?

正如@rich.okelly 提到的, int x = 12; 看起来不错;这样做的原因是因为我们经常将值类型语义理解为包括直接分配值。对我来说,引用类型赋值 var x = new RefType(); 一直推断分配和分配发生了不同的过程;新手用户可能会期望:

int x = new int(12);

XmlDocument x = new XmlDocument();

在某种程度上是等价的。

笔记:

我真的不相信这是一个除了在框架中实现它的任何人之外的任何人都可以回答的问题。

于 2012-06-22T16:05:09.717 回答