Dispose释放资源管理器

这里有两种释放资源的写法,实现原理基本相同,但是第二种方法更利于扩展,如下所示:

第一种方法的基类:

using System;
using System.IO;

namespace Dispose模式
{
    public abstract class BaseClass : IDisposable
    {
        protected BaseClass(string name)
        {
            _count++;
            Index = _count;
            Name = name;
        }

        private static int _count;

        protected int Index;

        protected readonly string Name;

        protected bool IsDisposed;

        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this);
        }

        protected virtual void Dispose(bool isDisposing)
        {
            if (!IsDisposed)
            {
                if (isDisposing)
                {
                    // 清理托管资源
                    File.AppendAllText("Test.txt", string.Format(Resources.ManagedFormat, Index, Name, "BaseClass"));
                }

                // 清理非托管资源
                File.AppendAllText("Test.txt", string.Format(Resources.UnmanagedFormat, Index, Name, "BaseClass"));
                IsDisposed = true;
            }
        }

        ~BaseClass()
        {
            Dispose(false);
        }
    }
}

子类:

using System.IO;

namespace Dispose模式
{
    public class SubClass : BaseClass
    {
        public SubClass(string name)
            : base(name)
        {
        }

        protected override void Dispose(bool isDisposing)
        {
            if (!IsDisposed)
            {
                if (isDisposing)
                {
                    // 清理托管资源
                    File.AppendAllText("Test.txt", string.Format(Resources.ManagedFormat, Index, Name, "SubClass"));
                }

                // 清理非托管资源
                File.AppendAllText("Test.txt", string.Format(Resources.UnmanagedFormat, Index, Name, "SubClass"));
                base.Dispose(isDisposing);
            }
        }

        ~SubClass()
        {
            Dispose(false);
        }
    }
}

从属子类:

using System.IO;

namespace Dispose模式
{
    public class SuperSubClass : SubClass
    {
        public SuperSubClass(string name)
            : base(name)
        {

        }

        protected override void Dispose(bool isDisposing)
        {
            if (!IsDisposed)
            {
                if (isDisposing)
                {
                    // 清理托管资源
                    File.AppendAllText("Test.txt", string.Format(Resources.ManagedFormat, Index, Name, "SuperSubClass"));
                }

                // 清理非托管资源
                File.AppendAllText("Test.txt", string.Format(Resources.UnmanagedFormat, Index, Name, "SuperSubClass"));
                base.Dispose(isDisposing);
            }
        }

        ~SuperSubClass()
        {
            Dispose(false);
        }
    }
}

测试类:

using System;
using System.IO;

namespace Dispose模式
{
    public class TestClass : IDisposable
    {
        public TestClass(string name)
        {
            _count++;
            Index = _count;
            _name = name;
            _baseClass = new SuperSubClass(_name);
        }

        private static int _count;

        protected int Index;

        private readonly string _name;

        private readonly BaseClass _baseClass;

        private bool _isDisposed;

        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this);
        }

        protected virtual void Dispose(bool isDisposing)
        {
            if (!_isDisposed)
            {
                if (isDisposing)
                {
                    // 清理托管资源
                    File.AppendAllText("Test.txt", string.Format(Resources.ManagedFormat, Index, _name, "TestClass"));
                    _baseClass.Dispose();
                }

                // 清理非托管资源
                File.AppendAllText("Test.txt", string.Format(Resources.UnmanagedFormat, Index, _name, "TestClass"));
                _isDisposed = true;
            }
        }

        ~TestClass()
        {
            Dispose(false);
        }
    }
}

第二种方法基类:

using System;
using System.IO;

namespace Dispose模式
{
    public class InheritedBaseClass : IDisposable
    {
        protected InheritedBaseClass(string name)
        {
            _count++;
            Index = _count;
            Name = name;
        }

        private static int _count;

        protected int Index;

        protected readonly string Name;

        private bool _isDisposed;

        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this);
        }

        protected void Dispose(bool isDisposing)
        {
            if (!_isDisposed)
            {
                if (isDisposing)
                {
                    DisposeManagedResources();
                }

                DisposeUnmanagedResources();
                _isDisposed = true;
            }
        }

        protected virtual void DisposeManagedResources()
        {
            // 清理托管资源
            File.AppendAllText("Test.txt", string.Format(Resources.ManagedFormat, Index, Name, "InheritedBaseClass"));
        }

        protected virtual void DisposeUnmanagedResources()
        {
            // 清理非托管资源
            File.AppendAllText("Test.txt", string.Format(Resources.UnmanagedFormat, Index, Name, "InheritedBaseClass"));
        }

        ~InheritedBaseClass()
        {
            Dispose(false);
        }
    }
}

子类:

using System.IO;

namespace Dispose模式
{
    public class InheritedSubClass : InheritedBaseClass
    {
        protected InheritedSubClass(string name)
            : base(name)
        {
        }

        protected override void DisposeManagedResources()
        {
            // 清理托管资源
            File.AppendAllText("Test.txt", string.Format(Resources.ManagedFormat, Index, Name, "InheritedSubClass"));
            base.DisposeManagedResources();
        }

        protected override void DisposeUnmanagedResources()
        {
            // 清理非托管资源
            File.AppendAllText("Test.txt", string.Format(Resources.UnmanagedFormat, Index, Name, "InheritedSubClass"));
            base.DisposeUnmanagedResources();
        }

        ~InheritedSubClass()
        {
            Dispose(false);
        }
    }
}

从属子类:

using System.IO;

namespace Dispose模式
{
    public class InheritedSuperSubClass : InheritedSubClass
    {
        public InheritedSuperSubClass(string name)
            : base(name)
        {
        }

        protected override void DisposeManagedResources()
        {
            // 清理托管资源
            File.AppendAllText("Test.txt", string.Format(Resources.ManagedFormat, Index, Name, "InheritedSuperSubClass"));
            base.DisposeManagedResources();
        }

        protected override void DisposeUnmanagedResources()
        {
            // 清理非托管资源
            File.AppendAllText("Test.txt", string.Format(Resources.UnmanagedFormat, Index, Name, "InheritedSuperSubClass"));
            base.DisposeUnmanagedResources();
        }

        ~InheritedSuperSubClass()
        {
            Dispose(false);
        }
    }
}

测试类:

using System.IO;

namespace Dispose模式
{
    public class TestInheritedClass : InheritedBaseClass
    {
        public TestInheritedClass(string name)
            : base(name)
        {
            _inheritedBaseClass = new InheritedSuperSubClass(Name);
        }

        private readonly InheritedBaseClass _inheritedBaseClass;

        protected override void DisposeManagedResources()
        {
            // 清理托管资源
            File.AppendAllText("Test.txt", string.Format(Resources.ManagedFormat, Index, Name, "TestInheritedClass"));
            _inheritedBaseClass.Dispose();
            base.DisposeManagedResources();
        }

        protected override void DisposeUnmanagedResources()
        {
            // 清理非托管资源
            File.AppendAllText("Test.txt", string.Format(Resources.UnmanagedFormat, Index, Name, "TestInheritedClass"));
            base.DisposeUnmanagedResources();
        }

        ~TestInheritedClass()
        {
            Dispose(false);
        }
    }
}

释放资源类:

using System;

namespace Dispose模式
{
    public static class Resources
    {
        public static readonly string ManagedFormat = "第{0}个对象{1},清理{2}托管资源" + Environment.NewLine;

        public static readonly string UnmanagedFormat = "第{0}个对象{1},清理{2}非托管资源" + Environment.NewLine;
    }
}

主类:

using System;
using System.IO;

namespace Dispose模式
{
    class Program
    {
        static void Main()
        {
            File.Delete("Test.txt");

            using (var a1 = new TestClass("a1"))
            {
                Console.WriteLine(a1.ToString());
            }

            var a2 = new TestClass("a2");
            Console.WriteLine(a2.ToString());

            var b1 = new TestInheritedClass("b1");
            Console.WriteLine(b1.ToString());
            b1.Dispose();

            var b2 = new TestInheritedClass("b2");
            Console.WriteLine(b2.ToString());
        }
    }
}

运行结果:

第1个对象a1,清理TestClass托管资源
第1个对象a1,清理SuperSubClass托管资源
第1个对象a1,清理SuperSubClass非托管资源
第1个对象a1,清理SubClass托管资源
第1个对象a1,清理SubClass非托管资源
第1个对象a1,清理BaseClass托管资源
第1个对象a1,清理BaseClass非托管资源
第1个对象a1,清理TestClass非托管资源
第1个对象b1,清理TestInheritedClass托管资源
第2个对象b1,清理InheritedSuperSubClass托管资源
第2个对象b1,清理InheritedSubClass托管资源
第2个对象b1,清理InheritedBaseClass托管资源
第2个对象b1,清理InheritedSuperSubClass非托管资源
第2个对象b1,清理InheritedSubClass非托管资源
第2个对象b1,清理InheritedBaseClass非托管资源
第1个对象b1,清理InheritedBaseClass托管资源
第1个对象b1,清理TestInheritedClass非托管资源
第1个对象b1,清理InheritedBaseClass非托管资源
第4个对象b2,清理InheritedSuperSubClass非托管资源
第4个对象b2,清理InheritedSubClass非托管资源
第4个对象b2,清理InheritedBaseClass非托管资源
第3个对象b2,清理TestInheritedClass非托管资源
第3个对象b2,清理InheritedBaseClass非托管资源
第2个对象a2,清理SuperSubClass非托管资源
第2个对象a2,清理SubClass非托管资源
第2个对象a2,清理BaseClass非托管资源
第2个对象a2,清理TestClass非托管资源

 

转载于:https://www.cnblogs.com/nogic/archive/2013/01/29/2881173.html

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值