我在某处读到,使用new
实例化struct
会将默认值分配给所有实例变量。是否暗示结构将通过默认的隐藏构造函数初始化其值?
答案 0 :(得分:3)
是否暗示结构将通过默认的隐藏构造函数初始化其值?
是的,在某种意义上,所有成员字段都将被设置为其default(T)
值。
实际上,编译器可以做memset(ptr, 0, sizeInBytes)
之类的事情。实际发生的是实现细节。
答案 1 :(得分:0)
Struct不能具有无参数的构造函数,为了初始化您的值,您必须编写一个带有参数的构造函数,并在对象初始化时显式调用它,并且必须初始化所有字段,并且默认情况下,如果您未指定构造函数将所有值初始化为默认值,就像您用不可见的值表示的那样。 注意:例如,CLR允许Structs具有IL语言的无参数构造函数。
答案 2 :(得分:0)
.NET中占用N个字节的每种存储位置都有一个默认值,该值的表示形式是将N个字节序列初始化为零。任何引用类型的默认值将充当空引用,任何数字类型的默认值将充当数字零,而结构类型的默认值将充当其成员均具有默认类型的实例。创建包含的对象时,存储位置将初始化为默认值。与过程相关的存储位置类型的唯一方面是其大小。如果结构类型Foo
的长度为16个字节,并且一个类的字段类型为Foo
,则创建该类的实例将为该结构保留16个字节并将其初始化为零,而无需调用任何类型该结构的构造函数。
请注意,如果结构具有无参数构造函数,则在某些情况下,创建实例将调用该构造函数,但在许多情况下,创建存储位置将有效地创建实例而无需调用构造函数。由于并不清楚在哪种情况下适用哪种处理方法,因此某些语言设计者决定通过简单地禁止无参数构造函数的定义并假定没有结构将不使用它们来避免这个问题(忽略用其他语言声明的无参数构造函数的可能性) )。
答案 3 :(得分:0)
我的“变通办法”是将结构与无参数构造函数一起使用
struct MyStruc
{
// MyStruc( int NoOp = 0 ) did not work. The code was not called until a parameter was passed in.
public MyStruc( int NoOp )
{
MyFooBar = new FooBar()
}
public FooBar MyFooBar;
}
public class Main
{
// Implementation
public MyStruc ms = new MyStruct(0);
}