本人对C#是半桶水的人,近日对C#中的堆栈有些搞不清了。有人说:“C#的所有值类型与对象的引用是保存在栈中的,而所有的对象实例是保存在堆中的。”正确吗?
有人说:“堆栈就是平常说的栈,并没有堆栈这种数据结构。”正确吗?平时有错误时,VS里可以堆栈跟踪,这里的堆栈又是什么意思?平时一个对象本身就包含有值类型和对象的实例,它们又是如何保存的?
有人说:“堆栈就是平常说的栈,并没有堆栈这种数据结构。”正确吗?平时有错误时,VS里可以堆栈跟踪,这里的堆栈又是什么意思?平时一个对象本身就包含有值类型和对象的实例,它们又是如何保存的?
解决方案 »
- WinCE5.0 在VS2005(C#) RasDial 进行GPRS拨号成功后,已自动获得IP,但无法使用socket连接
- 使用WMI (Win32_NetworkAdapterConfiguration)获取subnet mask的问题
- 为什么我做的windows服务安装包能安装就是启动不了服务
- web service超时
- DataGridView问题
- Windows目录下的DLL文件在C#编程中如何应用?
- 请教一个多线程的小问题,希望各位高手多多帮忙
- dataGridView导出到Excel出点问题
- 请教:在c#中怎样连接access数据库?怎么读取xml里面的参数。谢谢!
- 【初级问题】如果实现在下拉列表中的数据是从数据库中得到的?
- C#winform复制指定的文件夹,文件到指的路径下怎样写呀??
- DropDownList 有关数据绑定的问题
字段有访问修饰符(public/private/protected/internal),变量没有。字段和变量虽然用起来差不多,但实际上有很大的区别。变量永远是储存在栈里面的。字段跟随类的实例走。如:
class ClassA
{
int i;//字段
}Class a = new ClassA();
Class b = new ClassA();现在其实有了两个i,a.i和b.i。要储存一个类的实例,实际上只要把这个类所有的字段存下来就够了。所以说类的实例存在哪里,字段就存在了哪里。对于值类型的类,类的实例储存在变量里面,也就是类的实例跟随变量储存在栈上。
对于引用类型的类,类的实例储存在托管堆上。如
struct StructA
{
int i;
}StructA a = new StructA();
这个时候,a这个变量保存了StructA这个类的一个实例,也就是保存了他所有的字段。StructA b = a;
这个时候出现了两个StructA实例,分别保存在a和b内,StructA的所有字段会被拷贝一份,也就是说现在已经有了两个i,a.i和b.i你自己可以推一下class的情况,看看是不是真的理解了。
“对于值类型的类,类的实例储存在变量里面,也就是类的实例跟随变量储存在栈上。
对于引用类型的类,类的实例储存在托管堆上。”后面那个问题是所有的对象实例是一个堆还有你这个不是C#问题,是数据结构问题。