- 值类型不会自动产生无参构构造函数,C#甚至不允许结构体等值类型定义无参构造函数(CLR是允许无参构造函数的)
- 值类型的初始化不会自动调用构造函数,必须要显示的调用
注意:只有当值类型的字段嵌套到引用类型中时,才会保证被初始化为0或者null。为了确保代码的“可验证性”,任何基于栈的值类型字段都必须在读取之前写入(赋值)。如果允许代码先读再写,就会造成安全漏洞。对于对于所有基于栈的值类型中的字段,C#和其他可生成“可验证”代码的编译器可以保证对他们进行“置零”,或至少保证在读取之前已经赋值,从而确保不会在运行时因为验证失败而抛出异常。这意味着完全忽略当前这个“注意”,,假定自己的值类型会初始化为0或null。
- 为了“可验证性”,在访问所有的值类型之前,都需要对所有字段进行赋值。不然报错。
class Program { static void Main(string[] args) { ddd d = new ddd(12,23); Console.ReadKey(); } } public struct ddd { int x; double y; ddd(int s_x, double s_y) { x = s_x; } }
错误列表:
-
严重性 代码 说明 项目 文件 行 禁止显示状态
错误 CS0171 在控制返回调用方之前,字段“ddd.y”必须完全赋值 Demo D:\Visual Studio 2015\Projects\Demo\Demo\Program.cs 17 活动
解决方案:
public struct ddd
{
int x;
double y;
public ddd(int s_x, double s_y)
{
this = new ddd();
x = s_x;
}
}
在值类型的构造器中,this代表值类型本身的一个实例,用new 创建的值类型的一个实例可以赋值给this,在New的过程中,会将所有的字段置零(所以new的位置很关键,此处如果先是x=s_x之后调用,则创建的所有实例的字段值都为0),在引用类型的构造器中,this被认为是只读的,所以不能赋值。