它是自己调用的.可不知道怎么写.象C++的 ~FunctionName()吗

解决方案 »

  1.   

    是的,~classname()
         {}
    Form或者page类已经继承了IDispose接口,写好了的
      

  2.   

    有为有垃圾回收机制,所以C#没有像C++那样的析构函数, C#的class里的~classname(){},其实只是override的Finalize()方法,该方法是由垃圾回收器最后来调用的.因为垃圾回收器执行该方法的时间是不确定的,所以如果你有在该方法内使用某些资源可能会有潜在的风险,因为在垃圾回收器执行Finalize方式时你根本不知道资源是不是还存在.
    所以一般建议不要在Finalize()方法(也就是C#所谓的析构函数)里做操作.
      

  3.   

    ……
    classname()
    {……}
    ……
      

  4.   

    当你的class如果override的Finalize()方法,会对程序性能有一定的影响.因为当.net的垃圾自动回收器启动回收内存时,它会识别那些可以被回收的垃圾对象是否有自己override的Finalize()方法,如果没有(大部分也都是没有的),就立即从内存中删除所有这些不带override Finalize()方法的垃圾对象,释放出内存空间来.如果有自己override的Finalize()方法的垃圾对象,虽然已经是垃圾了,但是垃圾自动回收器并不会立刻从内存中清理掉这些垃圾,而是还要把它们添加到一个终结队列里,然后启动一个新的线程,该线程会周期性地从终结队列里取出垃圾对象,并执行这些对象自身override的Finalize()方法,此后就可以从内存中删除该垃圾对象了。所以有自己override的Finalize()方法的对象在内存中停留的时间比没有自己override的Finalize()方法的对象停留的时间长很多,垃圾自动回收器要做的事情也更多。那么override Finalize()方法会对程序性能有影响,为什么微软还要让它存在呢?所以它还是有它的用处,它就是用来保证释放那些非托管(Unmanaged)资源的.因为垃圾自动回收器是无法去控制Unmanaged的资源,所以需要这样一个动作,在垃圾自动回收器回收了托管资源后就能去调用一个程序员自定义的方法,那么程序员就可以在自定义的方法里手工来释放那些Unmanaged的资源,从而保证了无论如何Unmanaged的资源最终都会被释放(即使在程序里程序员忘了调用回收Unmanaged资源的方法那么最后的垃圾自动回收器也一定会帮你调用,而C++的就没有这个机制保证,后果就是内存泄漏),而这里说的这个自定义方法微软就把它设计为override Finalize()方法.
      

  5.   

    所以前面有说到一般建议不要override Finalize()方法,除非你有需要释放对象使用的非托管资源.
    而前面也说了,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().希望对大家有帮助.