解决方案 »
- List<T> 中的T能否动态生成
- TreeView节点如何控制根节点不加复选框,而子节点前有复选框
- 在C#怎么将数据库里的字段绑定到datagridview的固定列名
- 页面设计。。。。在线等。。。每天一问
- 数据库连接资源释放问题?性能优化请教。
- 汉王眼车牌识别控件这几个函数怎么用??高分
- 筛选数据记录,实现不同数据库(access,oracle)之间的数据迁移(更新、插入、删除),xml定义表和查询语句,来实现一个公共类...如何实现
- 要开发一个项目,现在正考虑使用什么方法,各位大侠指点下
- 从Excel导入到oracle时出错,求助~
- 为什么在SERVER 2003下会出错?
- 求助 关于C#多线程调用c++dll
- 新人求一个C#入门的途径
系统分配的,如int i,在栈;new操作的内存在堆。
其次,C#和Java一般都避免提及“地址”,而是使用“引用”。因为在GC的作用下,对象在内存中的位置会移动,一般来说一个对象是没有固定的地址的,运行时(CLR或JVM)会维护这些对象的引用,以确保引用的有效性。
最后,在没有运算符重载时,==执行值比较。那么所谓的“比较内存首地址”应该是指“比较引用是否相等”。注意引用是针对对象的,而int这样的是值类型,在比较时CLR直接将其值压栈并执行比较,这个过程中没有任何“首地址”或者类似的东西出现。
堆和栈在这里并不是一个确定的数据结构,而更接近于一种概念,在实现上它们在不同平台上不一定相同,但拥有相同的特性。一般来说,栈上储存的是局部变量,堆则是动态分配的内存,引用类型的实例或者装箱的值类型实例都储存在堆上。举个例子
当你声明一个局部变量int a时,CLR会在栈上分配4字节的空间,这个空间直接储存a的值
当你声明一个局部变量object o时,CLR会在栈上分配一个引用大小的空间,这个空间储存一个引用(初始化为空引用)。
当你声明并初始化一个局部变量object o2 = new object()时,CLR会在栈上分配一个引用大小的空间,随后在堆上创建一个object对象,再令o2储存的引用指向新建的对象。