析构函数怎样用户触发的问题

ProjectDD 2009-11-27 05:32:10
class A{
X x;
internal A(){this.x=new X();}
void Test(){this.x=null;}
}
class X{
~X(){ MessageBox.Show("..."); }
}

NET因为托管内存,如果可以在A.Test中调用 this.x=null;时就析构X就好了,但实际情况不太会
~函数的可控制方法是GC中的什么调用 吗?谁比较清楚

如果在A.Test的this.x=null;以后就可以调用~X()就好了,但为什么不会,
...全文
63 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
龙宜坡 2009-11-27
  • 打赏
  • 举报
回复
程序员无法控制何时调用析构函数,因为这是由垃圾回收器决定的。垃圾回收器检查是否存在应用程序不再使用的对象。如果垃圾回收器认为某个对象符合析构,则调用析构函数(如果有)并回收用来存储此对象的内存。程序退出时也会调用析构函数。

可以通过调用 Collect 强制进行垃圾回收,但大多数情况下应避免这样做,因为这样会导致性能问题。
龙宜坡 2009-11-27
  • 打赏
  • 举报
回复
看看MSDN吧


不能在结构中定义析构函数。只能对类使用析构函数。

一个类只能有一个析构函数。

无法继承或重载析构函数。

无法调用析构函数。它们是被自动调用的。


析构函数既没有修饰符,也没有参数。

ProjectDD 2009-11-27
  • 打赏
  • 举报
回复
lindenrty 2009-11-27
  • 打赏
  • 举报
回复
.Net类的生命周期和其他语言有点不同
this.x=null;
你看上去是把他设空了,但是这个对象是否真的没用是由Framework决定的,就是你说的GC
判断条件主要是其他地方有没有引用,另外释放也不是立即的,存在时间差(检测周期)
如果你要手动立即卸载资源,一般这样
public class A :IDisposable
{
public A(){}
public ~A(){
Dispose();
}
public void Dispose()
{
Console.WriteLine("及时释放资源");
}
}


调用的时候,如果你用这样的方法 Dispose会自动执行
using (A var = new A()){
.......
}
到这里A的Dispose会自动执行

其他情况你需要手动调用Dispose



110,545

社区成员

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

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

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