它是自己调用的.可不知道怎么写.象C++的 ~FunctionName()吗
解决方案 »
- WPF中如何实现在波形上显示一个十字形图形,可以用鼠标拖动,并显示当前位置的波形数值
- 如何点击datagridview显示的一行数据,显示到texebox中,然后进行修改。
- [资源发布]*正则表达式效率监测程序*[资源发布]
- 菜鸟正则问题在线等!!!!!!!
- 怎么用字符串创建构造函数带参数的窗体.
- 请大家帮忙我看看是怎么回事,总出现“列名 'Top5' 无效”
- AppUpdater的問題...初步解決并可以使用,還有小問題,大家探討一下。順便散分
- HyperLink问题 - 定义图像尺寸
- 如何定义、引发ListBox中ListItem的双击事件
- c# Pop3Client获取邮件的数量
- Web工程中页面刷新而自定义控件不刷新
- 谢谢大家!!
{}
Form或者page类已经继承了IDispose接口,写好了的
所以一般建议不要在Finalize()方法(也就是C#所谓的析构函数)里做操作.
classname()
{……}
……
而前面也说了,override Finalize()方法的话会对程序性能有一定的影响(因为垃圾会存放更久,内存不能及时回收,另外垃圾回收器也要多做事情),那么对于有需要释放非托管资源的情况,微软提出了一个Dispose模式来解决这个性能影响的问题,也就是让你的class实现IDisposable接口.
一个标准的Dispose模式写法如下: // 已经被处理过的标记
private bool _alreadyDisposed = false; // 终结器。调用虚拟的Dispose方法
~MyClass()
{
Dispose(false); // 参数false表示不需要清理受托管资源,因为此时受托管资源已经被GC处理了
} // IDisposable的实现
public void Dispose()
{
Dispose(true); // 参数true表示清理受托管资源
GC.SuppressFinalize(true); // 禁止Finalization(终结操作)
} // 虚拟的Dispose方法
protected virtual void Dispose( bool isDisposing )
{
// 不要多次处理
if ( _alreadyDisposed )
{
return;
}
if(isDisposing)
{
.......// TODO: 此处释放受托管资源
} ...... // TODO: 此处释放非受托管资源。设置被处理过标记 _alreadyDisposed = true;
}那么这里的关键也就是public void Dispose()方法里的GC.SuppressFinalize(true),这句代码就告诉GC,虽然该对象有override的Finalize()但不要把该对象放到终结队列里,也不需要GC去调用它的Finalize()方法.
所以如果程序员在代码里手工调用了对象的Dispose方法,那么就会执行回收非托管资源,并执行GC.SuppressFinalize(true),从而保证了程序性能不受影响.
而如果一旦程序员忘了在代码里手工调用了对象的Dispose方法,那么最终GC会去执行override的Finalize()(也就是上面代码里的~MyClass()),那么程序性能受一些影响,但是保证了资源最终还是被回收.如果理解了上面的内容,那么就会更加清楚Dispose方法的作用,也会知道如果一个对象有Dispose方法,但我们没有在程序里去调用,后果会是什么样的.也能知道我们什么时候需要为自己的class设计Dispose和Finalize().希望对大家有帮助.