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
,并struct
用struct
是一个值类型,但仍然没有任何意义.对我来说,没有数组参与其中,看起来我会这样做:
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,依此类推.
如果使用默认的无参数构造函数实例化struct对象,则会根据其默认值分配所有成员.
由于结构是值类型,struct default(T)
在哪里T
将结构初始化为其默认值,这意味着它的所有成员都将初始化为其默认值 - null
对于引用类型和值类型的任何默认值.
所以这行代码StructAPI[] sAPI = new StructAPI[1];
基本上创建了一个StructAPI
包含单个StructAPI
实例的新数组,其mesh
属性是default(Mesh)
.