小弟最近在学.net的垃圾回收机制 其中讲了 对象在超出了作用域后 自动回收对象
哪么小弟就不解了 对象在超出了作用域是个什么概念 该怎么去理解呢?
还有什么是可达对象和不可达对象呢? 有知道的大神 希望给小弟指点下江山 谢谢
超出作用域就是超出可起作用的范围的意思。
比如,在一个函数里定义的局部变量,超出函数结束后就失效了;比如,在if语句块、循环语句块、using语句块里定义的循环变量、语句块内变量,甚至认为用花括号限定范围内定义的变量,在超出花括号或语句块后都叫超出作用范围。
dotnet的回收机制是在超出作用域后就存在可能,但不一定立即执行,因为回收垃圾是一个比较消耗资源的行为,只有在消耗系统太多的资源(内存)或系统资源严重不足或垃圾资源占用时间太长的时候才会回收。
貌似明白了 跟我猜想差不多 先谢谢大神了 请问怎么给分呢? 才进论坛没几天
面向对象语言,万物皆对象!
你要多看看面向对象的代码(即:继承,封装,多态,抽象)后就很好理解这个了。
如你声明一个类:
Class Man
{
}
下面就是,创建一个对象(下滑线为创建一个对象!,oneman是存放在栈上指向对象的一个引用,说白了就是这个对象的代言人)
Man onemen=new Man;
下面就是回收对象:
创建一个新类
Class People
{
Man onemen=new Man;
}
CLR(.net回收垃圾的机制,公共语言运行时),在最后一个“}”结束后就会回收这个对象“oneman”
你说的对象超出了作用域就是去找创建这个对象的函数体(就是"{}")之间都会有效,超出则不可访问。
最后一个问题你说的可达对象和不可达对象,我理解是可以访问(调用)或不可以,还是和这个作用域相关。
还有什么不理解再问吧
大神 是不是Man onemen=new Man 创建对象完毕了 这个对象就超出了对象作用域了呢?
@狂扁小朋友:
首先这段代码Man onemen=new Man,可能出现在一个类中,也可能出现在一个函数(方法)中。他们的特点都有作用域"{}"
一个类:Class A {
Man onemen=new Man
}
一个方法:void print(){
Man onemen=new Man
}
如果
Class A {
void print(){
Man onemen=new Man
}
void getObj{
oneman.一个属性=“aa”;//---------------这里去访问 oneman就是超出了作用域的范围!!
}
}
能明白了吗?不懂再问吧
@凡图: 大神 我大概明白了 如果在 A类里定义 如果A的对象超出作用域 那么 onemen也会跟着失去作用域 如果在A类的一个方法里定义 方法运行结束了 那么 onemen就超出了作用域了 是这样的吗?
@狂扁小朋友:
YES!完全正确。建议你先看"C#面向对象基础",你直接百度啊什么的这么搜。然后高级点6大设计原则,最后看看 工厂设计模式,然后你就茅塞顿开了。
哇。200分啊。我觉得楼主先去理解下作用域的概念,然后这个问题就迎刃而解了。
作用域的概念我懂 简单不科学的说法就是 在一对花括号里这个就是一作用域
我想验证下我理解的是不是对的呢
就是说 一个变量在一个作用域里 比如在一个方法里 这个函数执行完以后 这个变量就超出了作用域了 是这样的吗
概念好懂,想解释清楚还真不容易...