3个问题:
1.CLR只能通过AppDomain间接卸载Assembly,为什么不允许卸载单个Assembly?
2.const修饰的常量被保存在内存的什么位置,生命周期怎样?能否详细描述一下生命周期的过程?
3.如果1个类包括static成员,当该类的1个实例被GC回收以后,该static成员引用的内存是否会被释放?如果局部变量被声明为static或const,当方法调用栈结束以后,该变量是否会被释放?
以上问题困扰多时,特向园子里的大牛们请教!
1.为了元数据追踪粒度不要太小.之前拜读过,说是以程序集级别管理程序集也是可以实现的,只是微软的人觉得得不偿失,
2.const就是一个常量,内存的什么位置还真不知道.net应该是有自己的一套东西,但是常量是在程序集被加载时就有的,这个是肯定的,生命周期应该是与程序集一起的,程序集又是被域管理的,所以常量生命周期应该是从程序集加载,到域被卸载
3.static 静态成员属于类,而不属于对象,局部变量肯定只在当前作用域内有效,都不一定能坚持到调用栈被释放
第1个,有描述相对清楚一点的参考资料么?
第2个,有道理!
第3个,似乎类的static成员生命周期也和const一致?
我在想,既然static修饰变量的作用就是在到静态存储区分配内存,照此推理,static局部变量应该也是在static区,即使方法调用结束,这块内存依然没有被释放啊,有些困惑。
@卡米i: 1.百度下吧,应该能找到一个讲解的东西
2.静态变量和常量有着本质区别,常量不可修改,是编译时就非配好的内存空间的,静态变量是在第一次调用时,调用类的静态构造函数进行初始化的.
3.静态局部变量还真挺复杂
http://zhidao.baidu.com/link?url=pM0fXjsHQwZU_pSBBZn0_ya1GXQorrhvk4eIiySz0_mW5dH0ID130RVbwrYxYjsbfXVD1bn2qKHB5kVS-l-dca
@吴瑞祥: 谢谢!
BTW,非常赞同你对第2个问题的分析思路!对const我原以为内存中某一块特殊区域做了限制,一经写入无法更改,后来想想觉得这不科学,MS总不会为了一个const关键字而单独实现一种机制去管理这片特殊内存区域吧。
const编译时即已确定而非运行时,假如真像我猜测的那样,const和static就不应该出现在局部变量里,有什么意义呢?既然没意义,为什么C#没有限制呢,到目前为止我还没想到有什么样的应用场景会去这样做。
谢谢你的回复~!
第一个问题没看懂,能否用代码演示下。