对象设置为null,为什么引用变量还存在

corruption 2007-09-22 02:27:40

....
//--创建类实例
MyClass obj1=new MyClass();

//--引用
MyClass obj2=obj1;

//--释放
obj1=null;

//--查看obj2
if(obj2!=null) //--?????按理说这个obj2也应该为null
error("不为空");

....


class MyClass
{

}
...全文
336 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
duduly 2007-09-23
  • 打赏
  • 举报
回复
最好不要把null赋给任一个变量,毫无意义的事情
比如你有连接到数据库的连接,或是对文件进行操作的句柄,赋给null没有用的
要显示调用XXX.close(); 或是 XXX.dispose();
等下一轮垃圾回收线程对分配的空间或资源进行释放
GC工分成0,1,2代区
0代最小,小到能装到寄存器缓冲区里,等0代回收完之后,没有释放的资源便自动放到1代中了,依次类推
GC.Collect(); //将对0,1,2代区都进行垃圾回收
GC.Collect(0);//将对0代区都进行垃圾回收
GC.Collect(1);//将对0,1代区都进行垃圾回收
GC.Collect(2);//将对0,1,2代区都进行垃圾回收,跟GC.Collect();效果一样
wuqing5220 2007-09-22
  • 打赏
  • 举报
回复
i=n=5
n=0
i=0?
xminsong 2007-09-22
  • 打赏
  • 举报
回复
两个指向同一地址的变量(obj1、obj2),你只释放了obj1,obj1不再指某对象,
为null,但原对象还在,你并没有释放obj2,obj2还是指向该对象,当然不为null啦!
cyy1981 2007-09-22
  • 打赏
  • 举报
回复
设置为null 了 并没有释放掉空间,只有当gc调用给dispose 才release
jlhx_NET 2007-09-22
  • 打赏
  • 举报
回复
obj1.dispose()是显式回收外部资源,比如关闭文件等(当然,这就要你自己来写了),内存资源的释放,还得依靠垃圾回收器,垃圾回收器定期回收内存资源,Avoid(千金散尽还复来) 说得对,只要引用还在,那么是不会执行垃圾回收的,即使垃圾回收定期触发,也不会回收有引用的内存资源。其实,form类提供的Dispose函数就是一个典型的例子:
/// <summary>
/// 清理所有正在使用的资源。
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}

如果你要显式回收资源,就可以调用窗体对象.Dispose(),这个函数声明,实际上是调用上面的重载形式:
private void Dispose()
{
Dispose(true);//释放所有与窗体对象关联的控件对象占用的外部资源
}
如果垃圾回收器回收资源,会自动调用析构函数,当然,在IDE里你是看不到的,被封装了,应该是下面的形式:
~Form()
{
Dispose(false);//仅释放窗体对象的外部资源,至于控件所占用的外部资源,说不定在窗体 对象释放前,就已经被释放了,因为垃圾回收器自动回收是没有顺序的
因此你只管对象本身就行了
}
Visual00000000 2007-09-22
  • 打赏
  • 举报
回复
obj1.dispose()
应该也不会让GC立即回收obj1吧,GC会自己选择时间执行垃圾回收
调用GC.Collect()应会立刻回收
对垃圾回收不是很了解,建议看下<<.NET框架程序设计>>相关的章节
Avoid 2007-09-22
  • 打赏
  • 举报
回复
只要引用还在,那么是不会执行垃圾回收的
Ny-6000 2007-09-22
  • 打赏
  • 举报
回复
obj1.dispose()

这个方法应该可以的吧.?
fancystyle 2007-09-22
  • 打赏
  • 举报
回复
那怎么让obj1销毁?
fancystyle 2007-09-22
  • 打赏
  • 举报
回复
汗,真的不为空...难道还要等GC来收集?
netcoder 2007-09-22
  • 打赏
  • 举报
回复
obj1=null;
作用把obj1这个引用变量设置为空引用
至于obj1之前引用什么对象,对那个对象是没有任何影响的
比如:
A和B都喜欢C
现在A不喜欢C了
那B还是喜欢C
JGood 2007-09-22
  • 打赏
  • 举报
回复
if(obj2!=null) //--?????按理说这个obj2也应该为null
=========>
当然不为null

obj1与obj2同时指向引用MyClass的一个实例,
obj1 = null; 这不是释放,obj1不再引用MyClass的实例,但obj2仍在引用。

110,537

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧