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

Pro*_*mer 14 c# arrays struct unity-game-engine

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

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

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

public struct StructAPI
{
    public Mesh mesh { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

ClassAPI在阵列中使用时,它必须与所述初始化new能够使用其属性和方法之前的关键字:

ClassAPI[] cAPI = new ClassAPI[1];
cAPI[0] = new ClassAPI(); //MUST DO THIS!
cAPI[0].mesh = new Mesh();
Run Code Online (Sandbox Code Playgroud)

但事实并非如此StructAPI.看起来好像StructAPI不必在数组中初始化:

StructAPI[] sAPI = new StructAPI[1];
sAPI[0].mesh = new Mesh();
Run Code Online (Sandbox Code Playgroud)

如果你尝试同样的事情ClassAPI,你会得到一个NullReferenceException.

在阵列中使用它们时,为什么它与结构不同?

我理解上的差异之间class,并structstruct是一个值类型,但仍然没有任何意义.对我来说,没有数组参与其中,看起来我会这样做:

StructAPI sp;
sp.mesh = new Mesh();
Run Code Online (Sandbox Code Playgroud)

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

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

但是当把struct它放在一个数组中时,这是一个不同的故事.

数组是否正在初始化struct?我想知道发生了什么.

Zoh*_*led 10

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

数组元素数组元素
在创建数组实例时就会存在,并且在没有对该数组实例的引用时就不再存在.

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

出于明确赋值检查的目的,最初分配数组元素.

(强调我的).

这意味着当您声明一个数组时T,数组中的每个"单元格"都是使用初始化的default(T).对于引用类型default(T)返回null,但对于值类型,default(T)返回类型默认值 - 0对于数字,false对于bool,依此类推.

根据Using Structs(C#编程指南)页面:

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

由于结构是值类型,struct default(T)在哪里T将结构初始化为其默认值,这意味着它的所有成员都将初始化为其默认值 - null对于引用类型和值类型的任何默认值.

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