一个类的静态构造器用于执行类被引用或创建实例前的初始化工作,并且只会执行一次,那么如果需要在该类不会再被引用和创建实例之后(例如程序结束前)进行资源释放工作,请问用什么方法可以实现呢?(暂时称为静态析构吧?)

解决方案 »

  1.   

    不需要写静态析构,系统关闭的时候,静态变量会尝试调用Dispose,然后调用Finalize或者析构函数的。
      

  2.   

    .net 下有GC机制,一般不用你考虑析构问题,只有在那个类有非托管资源时才会考虑
    所以可以用以下方法
    class yourclass
    {
       static int nuse;
       static nomanager m_p;
       public static nomanager P{
          get{
             if( p == null )
             {
                 nuse = 0;
                 p = new ...
                    return p;
                } 
         }
       }
       ~yourclass()
       {
             nuse--;
             if( nuse == 0 )
               delete p;
         }}
      

  3.   

    public static nomanager P{
          get{
             nuse++;
             if( p == null )
             {
                    p = new ...
                    return p;
              } 
             
         }
      

  4.   

    什么时候该类不会再被引用和创建实例,什么时候自己释放资源。
    CLR或者编译器是不会知道什么时候该类不会再被引用和创建实例的。
      

  5.   

    比如这样
    public class config
    {
        int x;
    }public class myTest
    {
          public static config cfg;
          public static myTest()
          {
                cfg = new config();
          }
    }这样是第一次使用cfg的时候,就会调用静态构造函数,在你程序退出时候,才会释放cfg吧。计数器?这个,应该和COM不同的吧。如果这样,岂不是静态构造函数会调用多次了?至于什么时候卸载,应该是最后。后面是否会使用这个静态变量,clr貌似无法知道吧。
      

  6.   

    谢谢各位
    实际上,在程序结束的时候执行就行了,因为如果程序结束了,CLR就可以确信这个类不会再被引用了(如果c#有静态析构的话,我想也会在程序结束时执行吧)。这个释放过程当然可以自己写到程序的结尾,只是有点破坏OOP而已啦。。
      

  7.   

    ms不赞成使用自己的析构函数释放资源,clr已经处理的很好了。你自己写的析构很可能会破坏程序运行以及一些优化原能(比如程序局部性原理)
      

  8.   

    ms不赞成使用自己的析构函数释放资源,clr已经处理的很好了。你自己写的析构很可能会破坏程序运行以及一些优化原能(比如程序局部性原理)
    =====
    如果是非托管资源呢??
      

  9.   

    嗯,其实只是想找一种首次引用时获取(非托管)资源,程序结束时释放资源的OOP良好的方法。。但似乎不太容易,否则微软自己的很多封装非托管资源的类也没必要提供Dispose()了,但是我只要求程序结束时释放。。
      

  10.   

    你静态变量是什么类型,这个类型实现IDispose就可以了。
      

  11.   

    static 在的程序生命周期都唯一的,所以不能被程序的析够。如果可以的被析够程序逻辑就错了。
      

  12.   

    Dispose()似乎不会自动调用的啊?
    class Test
    {
    static x m_x = new x();
    static void Main()
    {
    }
    }    
       
    class x : IDisposable
    {
    public void Dispose()
    {
    System.IO.File.AppendAllText("f:\\a.txt", "hello world!");
    GC.SuppressFinalize(this);
    }
    ~x()
    {
    //System.IO.File.AppendAllText("f:\\a.txt", "hello world!");
    }
    }
      

  13.   

    不需要写的,托管的东西CLR中也有相应专门的类来管理。
      

  14.   

    不知道.net程序结束时会不会自动释放未释放的非托管资源呢,如果会的话那也没问题了
      

  15.   

    发现现在的程序员真是越来越回去了。任何一个稍微聪明的C++程序员都懂得的手法。把你的非托管资源用个托管类包装,然后写析构函数,把这个类的实例作为静态成员,那么这个时候程序结束时必然会释放这个托管类从而调用析构函数。
    但一定记住任何托管资源都不应在析构函数中处理,即使是间接的非托管资源,例如SqlConnection。非托管资源是指你直接用P/Invoke调用或是不安全代码动态分配的内存。
      

  16.   

    class Program
        {
            static Program()
            {
                Console.WriteLine("Program Start");
                AppDomain.CurrentDomain.ProcessExit += new EventHandler(CurrentDomain_ProcessExit);
            }        static void CurrentDomain_ProcessExit(object sender, EventArgs e)
            {
                Console.WriteLine("Program Stop");
            }        static void Main(string[] args)
            {
                Console.WriteLine("Program Run");
            }
        }