大家会经常用对值类型进行new操作,如
给int类型赋默认值 int i=new int();
或者建立struct对象并调用默认构造函数 mystruct ms=new mystruct();
那问题来了,值类型的new 与 引用类型的new背后有什么区别呢?
引用类型:myClass mc=new myClass(); //引用类型new的指令实际是newobj instance。功能是分配内存空间,将新实例中的所有字段初始化为0或空引用,再调用构造函数,最后返回空间地址 (newobj用于分配和初始化对象)
值类型: int i=new int(); //值类型是执行initobj指令。功能是将位于指定地址的对象的所有字段初始化为空引用或适当的基元类型的0 。与Newobj不同,构造函数不是由initobj调用,而是系统自动调用 (Initobj用于初始化值类型)
所以引用类型的new操作和值类型的new操作是不一样的。
例:
public struct TestStruct
{
public int n;
public string s;
public StringBuilder sb;
}
当他
TestStruct t = new TestStruct();
new时的结果是什么?其结果就是调用系统默认构造函数把int类型被初始化为0,对象全部被置为null。
结论
值类型的new操作是不执行分配内存操作的,其new操作只执行初始化数据操作,调用构造函数(非initobj调用,是系统自动调用)。所以微软关于new关键字的用途的说法是不全面的。因为new还有一种只初始化数据,调用构造函数而不在托管堆分配内存的功能。