析构函数的主体部分如何写 我知道析构函数是为了帮助系统及时回收资源,在调用GC.Collect()命令或用using()后马上执行对象的销毁与回收工作。析构函数的写法是~<类名>{ //析构函数的主体 }我的问题是这个析构函数的主体一般怎么来写呢? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 public void Dispose(){Dispose(true);GC.SuppressFinalize(this);}//實現接口IDisposableprotected virtual void Dispose(bool disposing){if (!isDisposed){if (disposing){// Cleanup managed objects by calling their// Dispose() methods.}// Cleanup unmanaged objects}isDisposed = true;}~TypeName(){Dispose (false);} cn.close()da.dispose()cm.dispose()------------前提是,存在以上对象.其实现在之语言而言,基本不需要手动写了.系统会自动处理地. 是的,有数据库存取和文件存取这样的非托管资源,再问一下cjnet:// Cleanup managed objects by calling their// Dispose() methods.如何cleanup managed objects?这里应该只需要调用dispose方法// Cleanup unmanaged objects如何cleanup unmanaged objects?这里也是调用dispose方法吗? managed objects没有Dispose方法也不需要... 瞎说。不要把它跟Dispose搞混了。 不要滥用cleanup这个词。dispose跟释放对象没有关系。照你的思路,那么每当使用完一个对象都应该执行一次 GC.Collect() 过程了,那么设计 GC 这种延迟回收内存的机制不就自相矛盾了嘛?学c++走火入魔了吧!套用c++的析构概念,你就无法更好地理解.net。 dispose根本不是cleanup对象,所以你绕不出来了,因为纠缠cleanup这个词。根本不释放对象,而只是执行dispose方法而已。当执行了dispose,如果是使用“弱引用”变量来关联到对象的,会发现对象还是存在一段时间的,直到GC真正释放它。 析构函数当应用程序封装窗口、文件和网络连接这类非托管资源时,应当使用析构函数释放这些资源。 析构函数用于析构类的实例。 析构函数本质上是一个方法protected void Finalize() { }析构函数也可以被显式调用 通常不需要写,除非你明确地知道如果不写就会造成什么内存泄漏问题(例如你调用了c的dll之类的,并且必须再此时去通知它,例如你的代码本身就是一个传递给它的回调)。根本不需要写。所以也不用考虑“主体一般怎么来写”。真因为此,才有了SuppressFinalize这个方法告诉GC根本不需要调用析构函数。许多高效的托管代码都调用这个,因为析构根本什么都不做,何必要调用一次? 不要看一点c++的析构函数文档就套用到.net托管代码上面来。统计对象的大小、释放对象所占用的内存,根本不用你去些什么析构函数。既然个根本不用套用c++的析构函数的概念,你还想知道什么“主体”呢? 析构练习:using System;class StaticConstructor:IDisposable //继承IDisposable接口{ private bool disposed = false; public void Dispose() //实现IDisposable接口中的Dispose方法 { Dispose(true); } public void Close() //Close方法 { Dispose(true); } ~StaticConstructor() //析构函数 { Dispose(false); } public void Dispose(bool disposing) { if(!this.disposed) { if(disposing) { Console.WriteLine("调用引用类的Dispose()方法"); //Dispose方法先调用引用类的Dispose()方法释放它们的托管资源 } Console.WriteLine("调用本身类的Dispose()方法"); disposed = true; if(disposing) { GC.SuppressFinalize(this); //Dispose方法阻止finalize方法 } } }}class Test{ public static void Main() { //第一种方式:直接调用 //StaticConstructor sc = new StaticConstructor(); //sc.Dispose(); //sc.Close(); //第二种方式:放在try-finally语句块中// StaticConstructor sc = new StaticConstructor();// try// {// Console.WriteLine("用sc去做一些事情");// }// finally// {// sc.Dispose();// } //使用using语句 using(StaticConstructor sc = new StaticConstructor()) { Console.WriteLine("用sc去做一些事情"); } }} 我觉得SP1234说的很有道理,只有非托管代码才需要析构函数,.NET貌似有自己的垃圾回收机制不需要你操心,是这样吧SP1234? 理解完全错误...非托管代码和非托管资源是两码事,托管代码也能访问非托管资源,托管代码用的不好也会造成内存泄漏...在.NET中,析构函数只是最后一道防线...就是说析构函数并不是为了让你有了它就可以撒手不管了...相反它提醒你应该小心使用非托管资源,它只应该在程序员犯错或调用Dispose方法显式释放失败的时候起作用,以便GC不得已才去擦屁股...换句话说,析构函数只是道保险,如果你的代码够健壮就不需要它...依赖析构函数不但无益反而会造成性能问题...这和C++是本质不同的... 析构函数一般用写,请参见MSDN,C#析构函数:http://msdn.microsoft.com/zh-cn/library/66x5fx1b(v=VS.100).aspx WPF中怎么把图像(BitmapImage)转换成Byte[]类型 关于XML的一个问题 C#中的界面! 系统是 WIN98的 64M 内存的本本 用什么方法学习C#啊?? dotnet reactor.v4.0.0.0 代码混淆 如何这样添加进度条? asp.net對access增刪改問題(急急急急急急急急急急急急急急急急急急急急急急急) .net2003的解决方案如何在.net2002中打开?????? 怎么在C#中连接远程的Oracle数据库! 有关数据类型的问题 事件中顺序执行的问题 vs.net中断调试时问题【目前无法在编辑器中修改此文本。此文本是只读的。】
{
Dispose(true);
GC.SuppressFinalize(this);
}
//實現接口IDisposable
protected virtual void Dispose(bool disposing)
{
if (!isDisposed)
{
if (disposing)
{
// Cleanup managed objects by calling their
// Dispose() methods.
}
// Cleanup unmanaged objects
}
isDisposed = true;
}
~TypeName()
{
Dispose (false);
}
da.dispose()
cm.dispose()------------前提是,存在以上对象.
其实现在之语言而言,基本不需要手动写了.系统会自动处理地.
再问一下cjnet:
// Cleanup managed objects by calling their
// Dispose() methods.
如何cleanup managed objects?这里应该只需要调用dispose方法
// Cleanup unmanaged objects
如何cleanup unmanaged objects?这里也是调用dispose方法吗?
不要滥用cleanup这个词。dispose跟释放对象没有关系。照你的思路,那么每当使用完一个对象都应该执行一次 GC.Collect() 过程了,那么设计 GC 这种延迟回收内存的机制不就自相矛盾了嘛?学c++走火入魔了吧!套用c++的析构概念,你就无法更好地理解.net。
dispose根本不是cleanup对象,所以你绕不出来了,因为纠缠cleanup这个词。根本不释放对象,而只是执行dispose方法而已。当执行了dispose,如果是使用“弱引用”变量来关联到对象的,会发现对象还是存在一段时间的,直到GC真正释放它。
析构函数用于析构类的实例。
析构函数本质上是一个方法
protected void Finalize()
{
}
析构函数也可以被显式调用
通常不需要写,除非你明确地知道如果不写就会造成什么内存泄漏问题(例如你调用了c的dll之类的,并且必须再此时去通知它,例如你的代码本身就是一个传递给它的回调)。
根本不需要写。所以也不用考虑“主体一般怎么来写”。真因为此,才有了SuppressFinalize这个方法告诉GC根本不需要调用析构函数。许多高效的托管代码都调用这个,因为析构根本什么都不做,何必要调用一次?
using System;
class StaticConstructor:IDisposable //继承IDisposable接口
{
private bool disposed = false;
public void Dispose() //实现IDisposable接口中的Dispose方法
{
Dispose(true);
}
public void Close() //Close方法
{
Dispose(true);
}
~StaticConstructor() //析构函数
{
Dispose(false);
}
public void Dispose(bool disposing)
{
if(!this.disposed)
{
if(disposing)
{
Console.WriteLine("调用引用类的Dispose()方法"); //Dispose方法先调用引用类的Dispose()方法释放它们的托管资源
}
Console.WriteLine("调用本身类的Dispose()方法");
disposed = true;
if(disposing)
{
GC.SuppressFinalize(this); //Dispose方法阻止finalize方法
}
}
}
}
class Test
{
public static void Main()
{
//第一种方式:直接调用
//StaticConstructor sc = new StaticConstructor();
//sc.Dispose();
//sc.Close();
//第二种方式:放在try-finally语句块中
// StaticConstructor sc = new StaticConstructor();
// try
// {
// Console.WriteLine("用sc去做一些事情");
// }
// finally
// {
// sc.Dispose();
// }
//使用using语句
using(StaticConstructor sc = new StaticConstructor())
{
Console.WriteLine("用sc去做一些事情");
}
}
}
析构函数一般用写,请参见MSDN,C#析构函数:
http://msdn.microsoft.com/zh-cn/library/66x5fx1b(v=VS.100).aspx