新的[]在类和结构中做了什么?

时间:2013-06-26 05:00:36

标签: c# class struct indexer

MyClass[] CLASS = new MyClass[5];
int[] STRUCT = new int[5];

new []为一个类和一个struct做了什么。显然,struct有一些重载的静态索引,导致它运行struct的默认构造函数。然而,类的new []似乎什么都不做,只是腾出空间来初始化类的实例。如何重载类的静态行为以运行默认构造函数。我知道如何使用for循环和其他方法来实现这一点。我的问题非常具体到新[]下面发生了什么。我知道结构需要一个默认值。但是,非可空类也不需要默认值,这就是为什么当你尝试使用它时会出错的原因?或者这是否告诉我所有类都可以为空?

1 个答案:

答案 0 :(得分:2)

不,struct的默认构造函数未运行。相反,在struct情况下,内存被初始化为零。这意味着什么取决于数据类型。例如,参考字段(如类或字符串)变为null,数字字段变为0,布尔字段变为false等。

这与课程的工作方式有很大不同。这就是为什么初始化class数组时,您会看到null值。基本上,它归结于此。 “空”class变量(或您的案例中的数组)变为null。但是,当您有一个“空”struct时,您已经拥有了一些有效的东西。但是,它被初始化为空。

查看此内容的最简单方法是在一个类中有一个int字段。这基本上以相同的方式工作。向类添加int字段时,不需要初始化它。如果不初始化它,默认情况下它将获得值0struct在这方面的工作方式相同。

有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/aa664471.aspx

还有一些事项需要注意(回答评论中的问题):

  • 类始终可以为空。这意味着初始化数组的唯一方法是创建一个循环并为数组中的每个项初始化一个新实例;
  • 默认构造函数不适用于结构,因为不允许它们具有默认构造函数。如果您尝试编译以下代码段,则会收到编译错误,告诉您:

    struct MyStruct
    {
        public MyStruct()
        {
        }
    }