当前位置: 代码迷 >> .NET Framework >> C#门类对象 和 对象实例 的区别
  详细解决方案

C#门类对象 和 对象实例 的区别

热度:3752   发布时间:2013-02-25 00:00:00.0
C#类型对象 和 对象实例 的区别
 比如:A a= new A();实例化一个A对象,A本身是一个类型,有他的结构,而a是一个A类型的实例化对象,毋庸置疑,a是在托管堆上分配的,而A对象呢,它在哪儿分配呢,还有如果垃圾回收,a无用时,自然会被回收,而A类型本身也会随之回收吗

------解决方案--------------------------------------------------------
.net会在使用一个类型时首先把类型代码加载到内存,调用类型实例化方法,然后才创建对象,调用对象实例化方法。

不过只要知道就行了,你没有必要可以纠结于“在哪儿”。因为.net不同版本、同一版本在不同硬件上的实现,都可以是不一样的。.net不像c那样只是一个低级的程序控制。
------解决方案--------------------------------------------------------
首先A不是实际存在的,这里的实际存在是指他在内存中有一个位置。
A只是一堆指令。当然A也要占一点内存,用于存放这些指令。A中的静态变量在程序初始化的时候也会被分配到内存中。
a是根据A的指令来开辟内存的,这个过程就是 new A();。

我觉得你还是别问这些东西,如果真那么好奇,你应该把大学里的基本基础书籍看明白先。大概是《计算机组成原理》《编译原理》 《汇编程序设计》这3本吧,也许还得看个《C语言》什么的。最后再看看《.net framework框架程序设计》,就都明白了。
------解决方案--------------------------------------------------------
A也是放在内存的某个位置,可以通过反射获取
当a被回收的时候,A不会被回收,
A被回收的情况如下
1.进程关了,当然一切都被回收,释放了。
2. .net引入了AppDomain概念,也就是一个进程中可以有多个AppDomain(一个IIS进程可以有多个网站),
AppDomain可以加载Dll,然后当A第一次被调用的时候,会把A的数据结构加载到AppDomain中,
可以把进程中的AppDomain释放,那么A也跟着被释放。

详情可以看《CLR via C#》这本书,.net程序员必看~
  相关解决方案