想知道,这两种声明方式本质上的区别是什么?
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时,与直接赋值并没有区别。