Why Must I Initialize All Fields in my C# struct with a Non-Default Constructor?
如果在结构的构造函数中
internal struct BimonthlyPair
{
internal int year;
internal int month;
internal int count;
internal BimonthlyPair(int year, int month)
{
this.year = year;
this.month = month;
}
}
我没有初始化字段(在这种情况下计数)我收到错误:
必须完全分配字段'count' 在控制权返回之前 呼叫者
但是如果我在这种情况下分配所有字段,包括
之类的字数this.year = year;
this.month = month;
this.count = 0;
错误消失了。
我认为这是因为当有人创建新的struct对象时,C#不会初始化struct字段。 但是,为什么呢?据我所知,它在其他一些情境中初始化变量,为什么结构是一个不同的风景?
答案 0 :(得分:8)
当您使用默认构造函数时,隐式保证结构的整个值被清除。
当你创建自己的构造函数时,你继承了这个保证,但是没有强制执行它的代码,所以你应该确保整个结构都有一个值。
答案 1 :(得分:7)
我无法回答原因。但你可以通过使用:this()来解决它。
internal struct BimonthlyPair
{
internal int year;
internal int month;
internal int count;
internal BimonthlyPair(int year, int month)
: this() // Add this()
{
this.year = year;
this.month = month;
}
}
答案 2 :(得分:0)
因为,与存储在堆中的类不同,结构是值对象,并且将保存在堆栈中。这与在使用它之前分配局部变量的原理相同。