为什么我需要创建一个属性来检查在c#中使用一次性pastern时是否已经处理了资源?

Jun*_*ior 0 .net c# dispose idisposable

我需要编写一个类,我想让消费者通过using(...)在C#中包装带有语句的代码来处理代码.

为此,我必须实现Microsoft的IDisposable界面.

基于Microsoft实现它的方法,我应该做这样的事情

这样的通用接口

public interface ISomeClass : IDisposable
{
     // ... some methods to include
}

public class SomeClass : ISomeClass
{
     private readonly TimeTrackerContext _context;

    private bool disposed = false;

    protected virtual void Dispose(bool disposing)
    {
        if (!this.disposed && disposing && _context != null)
        {
            _context.Dispose();

        }
        this.disposed = true;
    }

    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试以正确的方式学习C#,因此我对此实现有一些疑问.

为什么我真的需要有一个属性告诉我在处理之前对象是否已被处置?

换句话说,_context在处理它之前,我不能只检查是否为null吗?像这样的东西

public class SomeClass : ISomeClass
{
    private readonly TimeTrackerContext _context;

    private void SelfDisposing()
    {
        if (_context != null)
        {
            _context.Dispose();
        }

    }

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

    private void SelfDisposing(bool disposing)
    {
        if (_context != null && !this.disposed && disposing)
        {
            _context.Dispose();
        }

        this.disposed = true;
    }
}
Run Code Online (Sandbox Code Playgroud)

Ser*_*rvy 6

_context null如果对象已被处理,则不会出现.它仍将引用已经处置的对象.

现在,如果你可以确定你的对象是否被处置而不需要存储一个布尔变量,那就没关系了.

不应该拥有的是GC.SuppressFinalize 你的对象没有终结器,所以没有什么可以抑制的.

  • @MikeA`用于保存需要明确释放的资源的类型.您没有保留任何需要明确释放的资源,因此您不需要终结器(并且无论如何都没有).很可能你永远不需要在你的生活中写一个终结器,即使你不时需要创建一次性物体,你几乎只需要这样做,因为你正在封装其他一次性物体. (2认同)