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

为什么数组中的结构不需要初始化?

  •  14
  • Programmer  · 技术社区  · 6 年前

    我研究过这个问题,但找不到任何复制品我想知道为什么你可以用 struct 在数组中而不创建其实例。

    例如,我有一个 class 以及 结构 :

    public class ClassAPI
    {
        public Mesh mesh { get; set; }
    }
    
    public struct StructAPI
    {
        public Mesh mesh { get; set; }
    }
    

    什么时候? ClassAPI 在数组中使用,必须用 new 关键字,然后才能使用其属性和方法:

    ClassAPI[] cAPI = new ClassAPI[1];
    cAPI[0] = new ClassAPI(); //MUST DO THIS!
    cAPI[0].mesh = new Mesh();
    

    但情况并非如此 StructAPI . 看起来像 结构API 不必在数组中初始化:

    StructAPI[] sAPI = new StructAPI[1];
    sAPI[0].mesh = new Mesh();
    

    如果你用同样的方法 类API ,你会得到一个 NullReferenceException .

    为什么在数组中使用结构时它们会有所不同?

    我明白 结构 具有 结构 作为一种价值类型,但这仍然没有意义对我来说,如果阵列没有参与其中,看起来我是在这样做:

    StructAPI sp;
    sp.mesh = new Mesh();
    

    请注意 sp 变量未初始化,应导致编译时错误,该错误显示:

    错误CS0165使用未分配的局部变量“sp”

    但当 结构 被排列成一个数组。

    数组是否正在初始化 结构 在里面我想知道发生了什么事。

    3 回复  |  直到 6 年前
        1
  •  10
  •   Zohar Peled    6 年前

    根据 specification link 佩瑟拉尔在评论中提供:

    数组元素
    当创建一个数组实例时,数组的元素就已经存在,并且当没有引用该数组实例时就停止存在。

    数组中每个元素的初始值是默认值( Default values )数组元素的类型。

    为了确定分配检查的目的,数组元素被认为是初始分配的。

    (强调我的)。

    这意味着当您声明 T ,数组中的每个“单元格”都使用 default(T) . 对于引用类型 默认值(T) 收益率 null ,但对于值类型 默认值(T) 返回类型默认值 0 对于数字, false 为了布尔,等等。

    根据 Using Structs (C# Programming Guide) 页码:

    如果使用默认的无参数构造函数实例化结构对象,则所有成员都将根据其默认值进行分配。

    因为结构是值类型, 默认值(T) 在哪里? T型 是一个结构将结构初始化为其默认值,这意味着它的所有成员都将初始化为其默认值 无效的 对于引用类型和值类型的任何默认值。

    所以这行代码 StructAPI[] sAPI = new StructAPI[1]; 基本上创建了一个新的数组 StructAPI 包含单个 结构API 实例,其中 mesh 财产是 default(Mesh) 是的。

        2
  •  4
  •   Nisarg Shah    6 年前

    这可能是因为 有一个默认构造函数,结构实际上没有。

    为什么类数组需要初始化

    类创建对象,然后返回引用实际变量是对该值的引用。默认值始终为零,因此引用的默认值为 null ,因为 无效的 由所有零的地址表示,这意味着它不指向任何东西。

    因此,类数组的默认值都是空引用。

    为什么结构数组不需要

    另一方面,结构都是按值计算的。它们也没有默认的无参数构造函数,而且C不允许您创建一个构造函数(尽管CLR是这样做的)由于没有构造函数,CLR能够非常有效地通过将所有值归零来创建结构,而无需调用构造函数。

    你可以查看更多关于为什么这是从 this StackOverflow问题。

        3
  •  2
  •   Michał Turczyn    6 年前

    初始化数组时, 将默认值分配给其元素 :

    • null 对于引用类型,
    • 对于值类型,默认值有所不同:对于表示数字的类型,默认值为零;对于 struct 它有点不同,它的默认值是 结构 所有字段都设置为默认值。同样,对于引用类型 无效的 对于值类型,它取决于(如上所述)。

    所以,基本上,当初始化数组时 结构 初始化(设置为默认值),这就是为什么您可以访问它们的属性。