【问题标题】:What exactly is new [] doing in a class vs struct?new [] 在类与结构中究竟做了什么?
【发布时间】:2013-06-26 05:00:36
【问题描述】:
MyClass[] CLASS = new MyClass[5];
int[] STRUCT = new int[5];

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

【问题讨论】:

  • @CuongLe 什么数组?绝对没有的数组?当我创建一个 int 数组时,它会创建一个 0 数组,因为它是一个 struct,但是当我创建一个 class 数组时,它只会创建一个空间,因此在尝试使用它时会出现空错误。结构调用默认构造函数,但如果类索引完全没有调用,那么它实际创建的是什么?有没有办法像在结构中一样重载静态索引?就我而言, new CLASS[] 什么都不做,实际的数组是在 for 循环或任何用于初始化的方法中创建的。

标签: c# class struct indexer


【解决方案1】:

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

这与类的工作方式有很大不同。这就是为什么在初始化 class 数组时,您会看到 null 值。基本上,它归结为这一点。 “空”class 变量(或在您的情况下为数组)变为null。然而,当你有一个“空的”struct 时,你已经有了一些有效的东西。但是,它被初始化为空。

看到这一点的最简单方法是当你例如在一个类中有一个int 字段。这基本上以相同的方式工作。当您将int 字段添加到类时,您不需要对其进行初始化。当你不初始化它时,它默认获取值0struct 在这方面的工作方式相同。

更多信息请参见http://msdn.microsoft.com/en-us/library/aa664471.aspx

还有几点需要注意(回答 cmets 中的问题):

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

    struct MyStruct
    {
        public MyStruct()
        {
        }
    }
    

【讨论】:

  • 所有类都可以为空吗?如果在不使用 for 循环或其他结构的情况下无法为类的数组设置默认值,那么可空类和不可空类有什么区别?另外,如果 struct 的默认构造函数没有运行,那么它什么时候运行?
  • 但是不是所有的结构都有隐藏的默认构造函数吗?这是否意味着使 Boolean false 和 numeric 0 和 class null 程序员无法访问的代码,并且实际上是语言结构本身的一部分?例如,假设只是出于好奇,我想创建一个具有自己唯一默认值的简单值类型,但我无法在 c# 中执行此操作?
  • struct 并没有真正的默认构造函数。 C# 让它看起来像是有一个默认构造函数(你可以通过将: this() 添加到你的构造函数来进行构造函数链接),但它们实际上并不存在。
猜你喜欢
  • 1970-01-01
  • 2011-06-18
  • 2012-07-23
  • 2016-09-10
  • 2023-03-15
  • 2012-10-17
  • 2021-06-04
  • 1970-01-01
  • 2018-07-30
相关资源
最近更新 更多