我研究了这个主题,但找不到任何重复的主题。我想知道为什么您可以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
,并struct
用struct
是值类型,但仍然没有任何意义。对我来说,如果没有涉及数组,就好像我正在这样做:
StructAPI sp;
sp.mesh = new Mesh();
请注意,该sp
变量未初始化,并且应导致编译时错误:
错误CS0165使用未分配的局部变量'sp'
但是,当将它们struct
放入数组中时,情况就不同了。
数组在初始化struct
吗?我想知道发生了什么事。
根据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] 删除。
我来说两句