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

程序员

我研究了这个主题,但找不到任何重复的主题。我想知道为什么您可以struct在数组中使用a而不创建它的实例。

例如,我有一个class和一个struct

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看起来StructAPI不必在数组中初始化:

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

如果您尝试相同的操作ClassAPI,将会获得一个NullReferenceException

在数组中使用结构时,为什么与结构不同?

我明白之间的差别class,并structstruct是值类型,但仍然没有任何意义。对我来说,如果没有涉及数组,就好像我正在这样做:

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

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

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

但是,当将它们struct放入数组中时,情况就不同了。

数组在初始化struct吗?我想知道发生了什么事。

Zohar Peled

根据PetSerAl在评论中提供规范链接

数组元素数组元素
在创建数组实例时就存在,而在没有对该数组实例的引用时就不存在。

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

为了进行明确的赋值检查,将数组元素视为初始赋值。

(强调我的)。

这意味着当您声明的数组时T,将使用初始化数组中的每个“单元” default(T)对于引用类型,default(T)返回null,但对于值类型,default(T)返回类型的默认值-0数字,false布尔值等。

根据“使用结构”(C#编程指南)页面:

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

由于结构是值类型,default(T)这里T是一个结构初始化结构为它的默认值,这意味着它的所有成员都将被初始化为默认值-null引用类型和价值类型的任何缺省值。

因此,这行代码StructAPI[] sAPI = new StructAPI[1];基本上会创建一个StructAPI包含单个StructAPI实例的新数组,其mesh属性为default(Mesh)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么我不能在结构中初始化char数组

来自分类Dev

为什么不能在结构中初始化char数组?

来自分类Dev

创建数组初始化器时,为什么不必须输入new?

来自分类Dev

在C中初始化结构数组

来自分类Dev

初始化结构中的数组

来自分类Dev

结构或类中的数组初始化

来自分类Dev

在结构中初始化typedef数组

来自分类Dev

在C ++中初始化结构数组

来自分类Dev

C中的结构数组初始化

来自分类Dev

为什么用结构体初始化数组需要指定结构体名称

来自分类Dev

结构数组的初始化会初始化单个元素的所有成员,为什么?

来自分类Dev

为什么默认(结构值)数组初始化需要复制特征?

来自分类Dev

C:为什么我不能用大括号初始化数组内的结构?

来自分类Dev

为什么结构数组不需要大括号初始化?

来自分类Dev

初始化结构数组

来自分类Dev

无法初始化结构中的结构数组

来自分类Dev

MSVC为什么不初始化此const结构?

来自分类Dev

如何在结构中初始化此数组数组?

来自分类Dev

为什么在构造函数初始化程序中初始化 const char 数组成员不兼容?

来自分类Dev

为什么Swift中的公共类/结构需要显式的公共初始化器?

来自分类Dev

为什么结构在Swift之类的类中没有去初始化器?

来自分类Dev

为什么在C和C ++中这种不同的结构初始化行为?

来自分类Dev

无法理解为什么无法初始化对象初始化程序中的数组初始化程序

来自分类Dev

如何初始化结构数组的结构?

来自分类Java

数组不应由数组初始化程序静态初始化。为什么?

来自分类Dev

当将值分配给结构初始化程序中的字符串数组成员时,为什么会收到“ int-conversion”警告?

来自分类Dev

在C ++中初始化结构内数组的正确方法

来自分类Dev

如何在Julia中初始化结构数组

来自分类Dev

如何从C中的结构数组初始化单个元素?

Related 相关文章

  1. 1

    为什么我不能在结构中初始化char数组

  2. 2

    为什么不能在结构中初始化char数组?

  3. 3

    创建数组初始化器时,为什么不必须输入new?

  4. 4

    在C中初始化结构数组

  5. 5

    初始化结构中的数组

  6. 6

    结构或类中的数组初始化

  7. 7

    在结构中初始化typedef数组

  8. 8

    在C ++中初始化结构数组

  9. 9

    C中的结构数组初始化

  10. 10

    为什么用结构体初始化数组需要指定结构体名称

  11. 11

    结构数组的初始化会初始化单个元素的所有成员,为什么?

  12. 12

    为什么默认(结构值)数组初始化需要复制特征?

  13. 13

    C:为什么我不能用大括号初始化数组内的结构?

  14. 14

    为什么结构数组不需要大括号初始化?

  15. 15

    初始化结构数组

  16. 16

    无法初始化结构中的结构数组

  17. 17

    MSVC为什么不初始化此const结构?

  18. 18

    如何在结构中初始化此数组数组?

  19. 19

    为什么在构造函数初始化程序中初始化 const char 数组成员不兼容?

  20. 20

    为什么Swift中的公共类/结构需要显式的公共初始化器?

  21. 21

    为什么结构在Swift之类的类中没有去初始化器?

  22. 22

    为什么在C和C ++中这种不同的结构初始化行为?

  23. 23

    无法理解为什么无法初始化对象初始化程序中的数组初始化程序

  24. 24

    如何初始化结构数组的结构?

  25. 25

    数组不应由数组初始化程序静态初始化。为什么?

  26. 26

    当将值分配给结构初始化程序中的字符串数组成员时,为什么会收到“ int-conversion”警告?

  27. 27

    在C ++中初始化结构内数组的正确方法

  28. 28

    如何在Julia中初始化结构数组

  29. 29

    如何从C中的结构数组初始化单个元素?

热门标签

归档