int i = 1;和int i = new int();i=1;的区别,有点不解~
问题1:int i = 1;
与
int i = new int();
i=1;
有什么区别?
二者好像都是将数据存在栈中吧?
问题2:结构的使用上,new与不new有什么区别,是不是跟问题1是一回事儿?
谢谢解答。
------解决方案--------------------int你new与不new,系统还是要自动new 的,所以是一会事
------解决方案--------------------在C#中 没有区别
------解决方案--------------------to 问题1:int i = 1;
与
int i = new int();
i=1;
有什么区别?
二者好像都是将数据存在栈中吧?
有区别,后者有拆箱操作。
to 问题2:结构的使用上,new与不new有什么区别,是不是跟问题1是一回事儿?
同1
------解决方案--------------------int i = 1;
直接把i赋值1
int i = new int();
i = 1;
先把i赋值0
再把i赋值1
请看ildasm代码
{
.entrypoint
// 代码大小 4 (0x4)
.maxstack 1
.locals init ([0] int32 i)
IL_0000: nop
IL_0001: ldc.i4.1 //直接把i赋值1
IL_0002: stloc.0
IL_0003: ret
} // end of method Program::Main
.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
// 代码大小 6 (0x6)
.maxstack 1
.locals init ([0] int32 i)
IL_0000: nop
IL_0001: ldc.i4.0 //此处先把i赋值0
IL_0002: stloc.0
IL_0003: ldc.i4.1 //再把i赋值1
IL_0004: stloc.0
IL_0005: ret
} // end of method Program::Main
其它地方没有任何区别
int i = new int();
i = 1;
可以认为就是
int i =0;
i=1;
------解决方案--------------------new int()就等于0
结构作为变量时,必须赋初值后才可用,作为字段时系统会自动调用默认构造函数。
------解决方案--------------------T0:比如int a = new int();
是先在托管堆上为其分配空间并将其初始化为值类型的默认值(int类型默认为0),然后再通过拆箱动作在栈上为其创建副本,因为有一次拆箱操作所以效率不如int a = 1这样直接在栈上的初始化.
值类型初始化,是在栈上进行的,而不会 "先在堆,然后拆箱到栈.. "
你通过生成的IL代码也能看出来啊,如果有拆箱操作,两种方式的IL代码肯定也就不一样了啊..