首页 新闻 搜索 专区 学院

急急急! c# 对象生命周期问题

0
悬赏园豆:100 [已解决问题] 解决于 2011-10-06 15:11

void Method()

{

          MyClass x = new  MyClass();

}

MyClass是我自己定义的类,我在此实例化了一个对象,指针存x,实际的对象在堆内,当我在其他地方想再访问这个对象时怎么访问   因为   出了Method函数  那么指针x应该就被释放了,还有那么实际的对象  是什么时候会被回收。如何接着访问那个对象,多谢谢

急急急!

L4的主页 L4 | 初学一级 | 园豆:0
提问于:2011-09-19 10:57
< >
分享
最佳答案
1

问题的关键是方法是在线程栈中执行的,而你的对象指针并没有通过线程栈传递到另一个方法中,你创建的对象即使CLR还没有进行回收,也就是说还在内存中,但是你的代码并不知道对象的地址是什么,对吗?

所以要解决有两个办法:一参数传递给另一个方法,二 用一个静态的字段持有住你对象的引用..比如一个类中定义一个静态的集合字段,你的对象添加进去.因为静态字段属于类型,而类型的地址在CLR看来是加载了类型后,就不会改变的,除非AppDomain被卸载.

收获园豆:100
徐 磊 | 菜鸟二级 |园豆:305 | 2011-09-19 13:41
其他回答(5)
0

出了作用域是访问不了的,不管还有没有被回收

是要重用吗?可以用单例模式创建

wangd | 园豆:75 (初学一级) | 2011-09-19 11:03
0
artwl | 园豆:16526 (专家六级) | 2011-09-19 11:07

您好,想知道   就是面向对象   我开始设计了几个类,然后实例化他们的对象,可是就像上面我写的,实例化之后,再其它地方我再想访问   就没法找到那个对象了。怎么办?

举个简单的例子说明一下   我点击一个按钮调用构造函数生成一个对象,然后我点击另外一个按钮调用类型里面的方法getSize    请问如何进行。问题就是点击另外的按钮的时候,指针已经掉了吧,怎么找到我生成的那个对象呢。还有就是在C#里,GC是不定时的回收,因为指针掉了,所以 是不是有可能  我在第一个按钮里生成的那个对象已经死了呢。

麻烦您帮我解释解释  多谢。着急!

 

支持(0) 反对(0) L4 | 园豆:0 (初学一级) | 2011-09-19 11:16

@K4:

如果要在多处使用可以考虑用全局变量或传递参数

支持(0) 反对(0) artwl | 园豆:16526 (专家六级) | 2011-09-19 11:18

哦,多谢您。可是我  生成的对象是当我点击按钮是动态生成的,不能提前定义啊。而且是每点击一次都生成一个对象的。

怎么办?

支持(0) 反对(0) L4 | 园豆:0 (初学一级) | 2011-09-19 11:23

@K4:

不太清楚你的真实需求是什么,如果确定要产生多个对象可以在创建对象后放在一个泛型列表中。

支持(0) 反对(0) artwl | 园豆:16526 (专家六级) | 2011-09-19 11:26
0

你定义的是局部变量,当你出作用域时,栈上的引用首先被释放了,然后GC会在垃圾回收时,清理调堆上的实际对象。你可以使用全局变量,或者一些保值技术还保存你对象的内容。winform程序和web程序不同,winform程序使用全局变量就可以满足你要求,但web不行,只有静态变量能保值,但一般不用,而用其它的保值技术。你如果new出个新对对象,并在全局对象中有它的引用,比如它是某某集合的成员,那你跳出这个方法后,也不会被GC释放,因为那个集合对象没有被释放,你new的对象还在被其它对象使用。

MeteorSeed | 园豆:242 (菜鸟二级) | 2011-09-19 13:57
0

由于MyClass的实例x是Method的局部变量,所以它的作用域也就局限于该方法内部。出了Method之后是不能够再访问由x指向堆上的对象;

至于GC何时会去回收这块堆上的内存,是在第0代的缓冲区被分配完的时候进行垃圾回收时来收回内存的(可能在method方法内也可能出了该方法后)。

叶de第柒章 | 园豆:231 (菜鸟二级) | 2011-09-19 20:55
0

实际对象的回收是不确定的,如果你显示调用对象回收函数的话就立即回收了

喬喬AI | 园豆:996 (小虾三级) | 2011-09-19 23:15
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册