当前位置: 代码迷 >> C# >> int a=零; int a=new int();本质区别是什么
  详细解决方案

int a=零; int a=new int();本质区别是什么

热度:92   发布时间:2016-05-05 02:40:22.0
int a=0; int a=new int();本质区别是什么
想知道,这两种声明方式本质上的区别是什么?

int a=0; 
int a=new int();

我理解int a=0是栈变量编译器静态分配内存,而int a=new int()使用new操作符CLR运行时在堆上动态分配,但int类型应该是值类型,我看到一些资料写着值类型都应该是栈变量,这个有怎么理解?
------解决思路----------------------
            {
                int a = 0;
            }
            {
                int a = new int();
            }

  IL_0001:  nop
  IL_0002:  ldc.i4.0
  IL_0003:  stloc.0
  IL_0004:  nop
  IL_0005:  nop
  IL_0006:  ldc.i4.0
  IL_0007:  stloc.0
  IL_0008:  nop

查看IL代码,两者在编译后完全一样。
------解决思路----------------------
这个本来就是使用栈的,两种编译后的 IL 就是完全一致,所以没有任何区别。这问题先查一下 msdn:https://msdn.microsoft.com/zh-cn/library/fa0ab757.aspx,然后看下编译后的 IL,就可以自己得出结论了。

另外需要纠正下,值类型不一定都使用栈空间,比如一个引用类型内有个值类型字段,其就会随该引用类型被分配在堆上,只不过传递的时候默认传值(被复制到栈上)。而如果使用 ref / out 修饰传递,也可以传其引用。就算是局部的值类型变量,如果被闭包捕获,也会成为引用类型的字段而生存在堆上。
------解决思路----------------------
~~~c# 中new就是调用构造函数没有堆和栈的区分,你是结构体就在栈上,你是类就在堆上,不像c/c++代表堆上分配内存
你看你自定义的结构体不都是new还不是一样都在栈上;
------解决思路----------------------
当使用new时就会调用类型的构造函数,具体分配在堆还是栈还要看是值类型还是引用类型,并不是说new就一定在堆中分配内存空间。但你对值类型进行new时,与直接赋值并没有区别。