垃圾回收及IDispose

  • C#托管堆压缩:为了减少寻址时间,压缩。回收后,内存成为连续空间。
  • Gen0, Gen1, Gen2 越晚申请的越容易被回收:因为Gen0满了就删除,剩下的压缩后成为Gen1。同样Gen1满了,回收后压缩成为Gen2. 下次清理内存的时候,还是从Gen0回收。
  • C#基础类型的都是值类型,尤其是struct也是值类型。所有的值类型都集成自 System.ValueType 上,除非加声明?否则不可为null,保存在堆栈(Stack,先进后出)上,常见的值类型有:整形、浮点型、bool、枚举等。
  • 拆箱和装箱:引用类型和值类型的相互转换叫做拆装箱操作。
  • C#析构函数:GC回收的时候,看对象有没有析构函数,如果没有,直接释放; 如果有,把它放到另外一个队列,由另外这个队列执行完析构函数后,再释放该对象。

 

IDispose模式如下:

   public class SampleClass : IDisposable
    {
        //演示创建一个非托管资源
        private IntPtr nativeResource = Marshal.AllocHGlobal(100);
        //演示创建一个托管资源
        private AnotherResource managedResource = new AnotherResource();
        private bool disposed = false;

        /// <summary>
        /// 实现IDisposable中的Dispose方法
        /// </summary>
        public void Dispose()
        {
            Dispose(true); //必须为true!!
            //通知垃圾回收机制不再调用终结器(析构器)
            GC.SuppressFinalize(this);
        }

        /// <summary>
        /// 不是必要的,提供一个Close方法仅仅是为了更符合其他语言(如C++)的规范
        /// </summary>
        public void Close()
        {
            Dispose();
        }

        /// <summary>
        /// 必须,以备程序员忘记了显式调用Dispose方法
        /// </summary>
        ~SampleClass()
        {
            Dispose(false); //必须为false!!
        }

        /// <summary>
        /// 非密封类修饰用protected virtual
        /// 密封类修饰用private
        /// </summary>
        /// <param name="disposing"></param>
        protected virtual void Dispose(bool disposing)
        {
            if (disposed)
            {
                return;
            }

            if (disposing)
            {
                // 清理托管资源!!!
                if (managedResource != null)
                {
                    managedResource.Dispose();
                    managedResource = null;
                }
            }
            // 清理非托管资源!!!
            if (nativeResource != IntPtr.Zero)
            {
                Marshal.FreeHGlobal(nativeResource);
                nativeResource = IntPtr.Zero;
            }
            //让类型知道自己已经被释放
            disposed = true;
        }

        public void SamplePublicMethod()
        {
            if (disposed)
            {
                throw new ObjectDisposedException("SampleClass", "SampleClass is disposed");
            }
            //ignore
        }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值