对象设置为null,为什么引用变量还存在 ....//--创建类实例MyClass obj1=new MyClass();//--引用MyClass obj2=obj1;//--释放obj1=null;//--查看obj2if(obj2!=null) //--?????按理说这个obj2也应该为null error("不为空");....class MyClass{ } 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 if(obj2!=null) //--?????按理说这个obj2也应该为null=========>当然不为nullobj1与obj2同时指向引用MyClass的一个实例,obj1 = null; 这不是释放,obj1不再引用MyClass的实例,但obj2仍在引用。 obj1=null;作用把obj1这个引用变量设置为空引用至于obj1之前引用什么对象,对那个对象是没有任何影响的比如:A和B都喜欢C现在A不喜欢C了那B还是喜欢C obj1.dispose()这个方法应该可以的吧.? obj1.dispose()应该也不会让GC立即回收obj1吧,GC会自己选择时间执行垃圾回收调用GC.Collect()应会立刻回收对垃圾回收不是很了解,建议看下<<.NET框架程序设计>>相关的章节 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);//仅释放窗体对象的外部资源,至于控件所占用的外部资源,说不定在窗体 对象释放前,就已经被释放了,因为垃圾回收器自动回收是没有顺序的 因此你只管对象本身就行了} 设置为null 了 并没有释放掉空间,只有当gc调用给dispose 才release 两个指向同一地址的变量(obj1、obj2),你只释放了obj1,obj1不再指某对象,为null,但原对象还在,你并没有释放obj2,obj2还是指向该对象,当然不为null啦! 最好不要把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();效果一样 关于数据转换和上传的问题 gridview 类的私有属性是不是没法被反射? txt文本文件的编辑 怎么把手工建的DropDownList3=这个return DropDownList 的值 怎样使鼠标移到LinkButton1时,LinkButton1的字体颜色变为红色(开始是黑色)? 关于[C#中System.Array继承ICollection接口]的问题 c# 异步 回调读取。让回调函数执行完后返回 用vs.net没法建c# web应用程序 一个简单的可笑的问题,为什么没有人能够给个正确完整的答案,难道大家都没遇到过吗? 能帮我修改一下这个代码吗? 关于堆栈问题和装箱问题!!
=========>
当然不为nullobj1与obj2同时指向引用MyClass的一个实例,
obj1 = null; 这不是释放,obj1不再引用MyClass的实例,但obj2仍在引用。
作用把obj1这个引用变量设置为空引用
至于obj1之前引用什么对象,对那个对象是没有任何影响的
比如:
A和B都喜欢C
现在A不喜欢C了
那B还是喜欢C
应该也不会让GC立即回收obj1吧,GC会自己选择时间执行垃圾回收
调用GC.Collect()应会立刻回收
对垃圾回收不是很了解,建议看下<<.NET框架程序设计>>相关的章节
/// <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);//仅释放窗体对象的外部资源,至于控件所占用的外部资源,说不定在窗体 对象释放前,就已经被释放了,因为垃圾回收器自动回收是没有顺序的
因此你只管对象本身就行了
}
为null,但原对象还在,你并没有释放obj2,obj2还是指向该对象,当然不为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();效果一样