C# 基础系列类三(析构函数)

  析构函数不仅仅 是在C中用,其实在C#也是有这个的,写法很简单

   ~类名 (){}

  先给示例代码吧,。我们先新建两个项目--AssemblyLibrary(类库)和ConsolTest(控制台)

AssemblyLibrary

 public class DisposaClass //:IDisposable 
    {
        public string a = "1111";

        ~DisposaClass()
        {
            a = string.Empty;
            Console.WriteLine("Press enter to Destroy it");  
        }
}

 ConsolTest

  static void Main(string[] args)
        {
            DisposaClass dis = new DisposaClass();
            //dis.Dispose();
            Console.WriteLine("Total Memory: {0}", GC.GetTotalMemory(false));
            System.GC.Collect();
            System.Threading.Thread.Sleep(10000);
            Console.WriteLine("Total Memory: {0}", GC.GetTotalMemory(false));
            dis = null;
            Console.WriteLine("Total Memory: {0}", GC.GetTotalMemory(false));
            Console.Read();
 
        }

   System.GC.Collect()这个是清理内存的方法,    GC.GetTotalMemory(false) 检索当前认为要分配的字节数 

  在代码中,我还特意的 把对象置为null和让进程休眠了下,理论上来说,对象dis应该是被彻底释放完,那控制台是不是就打印出 :Press enter to Destroy it 呢?

 很遗憾,没有出现 Press enter to Destroy it 。这个很简单,GC的调用时系统控制的,我们也只是能发出指令,希望他清理内存,而不能强制他清理内存。

对于 一些对象而已,只要能 protected override void Finalize  的,不需要 ~ 类名 ,来实现析构函数 ,你override Finalize  就可以了。

0:32 了 。就不给例子了~~~

如果你说,析构函数 是 系统调用的,我们希望手动的调用呢?如果你 希望如此,那么就继承 接口IDisposable 就可以 了

 public class DisposaClass :IDisposable 
    {
        public string a = "1111";

        ~DisposaClass()
        {
            a = string.Empty;
            Console.WriteLine("Press enter to Destroy it");  
        }

        public void Dispose()
        {
            a = string.Empty;
        }
    }

  IDisposable  和  ~类名,的组合可以对内存的清理有不错的效果

Public class MyClass:IDisposable  
{  
private bool IsDisposed=false;  
public void Dispose()  
{  
   Dispose(true);  
   GC.SupressFinalize(this);  
}  
protected void Dispose(bool Diposing)  
{  
   if(!IsDisposed)  
   {  
   if(Disposing)  
   {  
    //Clean Up managed resources  
   }  
   //Clean up unmanaged resources  
}  
IsDisposed=true;  
}  
~MyClass()  
{  
   Dispose(false);  
}  
}

  

我跟人很少用这样做,虽然他可以有效的控制内存,我 之前做PDA的时候,才用了下单例和这些~~因为内存实在是太小了。

 尽管如此我们花费一些时间实现IDisposable接口,如果客户不能合适地调用它们会怎样?为此C#有一个酷的解决方案。‘using’代码块。它看起来像这样:

using (MyClass objCls =new MyClass())  
{  
   
}

 这个也是我现在比较喜欢用的方式,不需要自己Dispose对象。 特别是在winfrom中写自定义控件,如果不Dispose很容易内存溢出。

这章真心的不给力,越是这些基础的越难写。

 
原文地址:https://www.cnblogs.com/qionghua/p/2598469.html