【发布时间】:2018-07-22 05:56:51
【问题描述】:
我研究了这个主题,但找不到任何重复项。我想知道为什么您可以在数组中使用 struct 而无需创建它的实例。
例如,我有一个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?我想知道发生了什么。
【问题讨论】:
-
Specification:为了明确赋值检查,数组元素被认为是初始赋值的。
-
@PetSerAl 这是有道理的。所以它正在为数组中的每个项目做类似
StructAPI sp = default(StructAPI);的事情?如果是这样,它是编译时的还是运行时的? -
你能使用其他值类型的变量,比如
int,在C#中未初始化吗?如果不是,这是相同的想法。new int[5]全为零。 (我更多地使用 VB.NET,Dim sp As StructAPI : sp.mesh = New Mesh()会发出警告但工作正常。) -
@Programmer:听到这个我很惊讶。
-
@Programmer 那是因为你使用了属性。属性访问器只是一个方法,方法不能在未完全初始化的结构体上调用。但是即使结构没有初始化,也可以分配字段。