日期:2014-05-20  浏览次数:20951 次

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代码肯定也就不一样了啊..