zoukankan      html  css  js  c++  java
  • 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很容易内存溢出。

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

     
  • 相关阅读:
    设计模式——观察者模式
    LeetCode OJ——Word Ladder
    unorder_set<typename T> 学习
    LeetCode OJ——Text Justification
    LeetCode OJ——Two Sum
    LeetCode OJ——Longest Valid Parentheses
    路飞学城Python-Day16
    路飞学城Python-Day15
    路飞学城Python-Day14(practise)
    路飞学城Python-Day14
  • 原文地址:https://www.cnblogs.com/qionghua/p/2598469.html
Copyright © 2011-2022 走看看