c# disposing 语法

标签 c# .net dispose

我最近不得不实现 Dispose() 功能,并且遇到了 1 行方法、2 行方法和更全面的方法。

一个 1 行方法/函数会简单地调用类似“context.Dispose”的东西,但我选择的方法是这样的:

    bool _disposed = false;

    public void Dispose(bool disposing)
    {
        if (!_disposed && disposing)
        {
            _context.Dispose();
        }
        _disposed = true;
    }

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

这个语法仅仅是为了阻止 Dispose() 被多次调用吗?

最佳答案

您发布的部分是 Dispose Pattern .正如有人指出的那样,终结器(“析构函数”)中应该有相应的 Dispose(false)。终结器应该用于处理非托管资源。如果您没有要处理的非托管资源(即当 disposingfalse 时您无事可做),则不需要 Dispose(false) 因此不需要终结器。这意味着 Dispose(true) 是唯一的路径,因此您不需要 Dispose (bool) (因此不需要实现 Dispose 模式)和可以将它的主体移动到 Dispose(并删除对 disposing 的检查)并只实现 Dispose。例如:

public void Dispose()
{
    _context.Dispose();
}

没有实现自己的终结器(析构函数)的类不会放在终结器列表中,因此无需调用 GC.SuppressFinalize

一般来说,如果您要创建一个类,这就足够了。但是,有时您可以从实现此模式的类派生。在这种情况下,您应该在您的类中实现对它的支持(覆盖 Dispose(bool) 并执行 disposing 检查和 Dispose 任何托管资源).由于基类实现了 IDisposable 并在其 Dispose() 中调用了一个 virtual Dispose(bool),因此您无需实现 Dispose() 自己,但是你必须在你的 Dispose(bool) 中调用 base 的 Dispose(bool)。例如:

protected override void Dispose(bool disposing)
{
    if(disposing) _context.Dispose();
    base.Dispose(disposing);
}

如果您正在调用基础并且它实现了 Dispose 模式,那么您也不需要调用 GC.SuppressFinalize(),因为它已经在这样做了。

如果你愿意,你可以做整个disposed的事情;不过,我发现它隐藏了多处理错误。

关于c# disposing 语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12130311/

相关文章:

.net - Twitter Bootstrap 语法错误

.net core 在内存 zipfile 上创建

.net - 当用户单击 X(关闭程序)时,VB.NET 重载默认功能

C# 抽象 Dispose 方法

c# - .NET对象事件和处置/GC

c# - 如何将模板对象添加到 C# Frame 模板中

c# - 强制在不同命名空间的类之间进行类型转换

c# - 如何使用线程在控制台上同时进行读/写

c# - 表单在 Hide() 上处理

c# - 在 JavaScript 中使用 JSON 字符串