在Blazor中,通过IDisposable接口释放托管资源的一般套路(同步方式)

8 阅读1分钟

第一种标准模板:

public class MyService : IDisposable
{
    private bool _disposed = false;

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

    protected virtual void Dispose(bool disposing)
    {
        if (_disposed) return;

        if (disposing)
        {
            // 释放托管资源
        }

        // 释放非托管资源
        _disposed = true;
    }

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

第二种继承语法:

目的:演示为何要设置 虚函数 Dispose 的原因? 原因就是:子类可以先销毁自己的数据,再调用基类的Dispose,从而实现完美的销毁链条


using System.Runtime.InteropServices;

var x = new DerivedClass();
x.Dispose();


public class BaseClass : IDisposable
{
    protected bool _disposed = false;

    public void Dispose()
    {
        // 显示调用本函数时候,是BaseClass实例 还是 DerivedClass实例
        // 获取当前实例的类型
        Type type = this.GetType();
        Console.WriteLine("1 BaseClass Dispose() called. 实例类型是->" + type.Name);
        Dispose(true);
        GC.SuppressFinalize(this);
    }

    protected virtual void Dispose(bool disposing)
    {
        Console.WriteLine("3 BaseClass Dispose(bool) called.");
        if (!_disposed)
        {
            if (disposing)
            {
                // 释放托管资源
            }

            // 释放非托管资源
            _disposed = true;
        }
    }
}

public class DerivedClass : BaseClass
{
   
    protected override void Dispose(bool disposing)
    {
        Console.WriteLine("2 DerivedClass Dispose(bool) called.");
        if (!_disposed)
        {
            if (disposing)
            {
                // 释放派生类托管资源
                
            }

            // 释放派生类非托管资源
           
        }

        base.Dispose(disposing); // 最后调用基类释放
    }
}


1 BaseClass Dispose() called. 实例类型是->DerivedClass

2 DerivedClass Dispose(bool) called.

3 BaseClass Dispose(bool) called.