void Method()
{
MyClass x = new MyClass();
}
MyClass是我自己定义的类,我在此实例化了一个对象,指针存x,实际的对象在堆内,当我在其他地方想再访问这个对象时怎么访问 因为 出了Method函数 那么指针x应该就被释放了,还有那么实际的对象 是什么时候会被回收。如何接着访问那个对象,多谢谢
急急急!
问题的关键是方法是在线程栈中执行的,而你的对象指针并没有通过线程栈传递到另一个方法中,你创建的对象即使CLR还没有进行回收,也就是说还在内存中,但是你的代码并不知道对象的地址是什么,对吗?
所以要解决有两个办法:一参数传递给另一个方法,二 用一个静态的字段持有住你对象的引用..比如一个类中定义一个静态的集合字段,你的对象添加进去.因为静态字段属于类型,而类型的地址在CLR看来是加载了类型后,就不会改变的,除非AppDomain被卸载.
出了作用域是访问不了的,不管还有没有被回收
是要重用吗?可以用单例模式创建
参考这里:
http://www.cnblogs.com/yuerlovenet/archive/2010/01/05/object.html
http://www.cnblogs.com/jintianzhang/archive/2011/03/29/1998706.html
http://www.cnblogs.com/anytao/archive/2007/12/07/must_net_19.html
您好,想知道 就是面向对象 我开始设计了几个类,然后实例化他们的对象,可是就像上面我写的,实例化之后,再其它地方我再想访问 就没法找到那个对象了。怎么办?
举个简单的例子说明一下 我点击一个按钮调用构造函数生成一个对象,然后我点击另外一个按钮调用类型里面的方法getSize 请问如何进行。问题就是点击另外的按钮的时候,指针已经掉了吧,怎么找到我生成的那个对象呢。还有就是在C#里,GC是不定时的回收,因为指针掉了,所以 是不是有可能 我在第一个按钮里生成的那个对象已经死了呢。
麻烦您帮我解释解释 多谢。着急!
@K4:
如果要在多处使用可以考虑用全局变量或传递参数
哦,多谢您。可是我 生成的对象是当我点击按钮是动态生成的,不能提前定义啊。而且是每点击一次都生成一个对象的。
怎么办?
@K4:
不太清楚你的真实需求是什么,如果确定要产生多个对象可以在创建对象后放在一个泛型列表中。
你定义的是局部变量,当你出作用域时,栈上的引用首先被释放了,然后GC会在垃圾回收时,清理调堆上的实际对象。你可以使用全局变量,或者一些保值技术还保存你对象的内容。winform程序和web程序不同,winform程序使用全局变量就可以满足你要求,但web不行,只有静态变量能保值,但一般不用,而用其它的保值技术。你如果new出个新对对象,并在全局对象中有它的引用,比如它是某某集合的成员,那你跳出这个方法后,也不会被GC释放,因为那个集合对象没有被释放,你new的对象还在被其它对象使用。
由于MyClass的实例x是Method的局部变量,所以它的作用域也就局限于该方法内部。出了Method之后是不能够再访问由x指向堆上的对象;
至于GC何时会去回收这块堆上的内存,是在第0代的缓冲区被分配完的时候进行垃圾回收时来收回内存的(可能在method方法内也可能出了该方法后)。
实际对象的回收是不确定的,如果你显示调用对象回收函数的话就立即回收了