【问题标题】:Object that calls a method on Dispose调用 Dispose 方法的对象
【发布时间】:2016-09-13 11:24:57
【问题描述】:

是否有一个 .NET 类在释放时调用方法,有时而不是:

try
{
    ...
}
finally
{
    MyCleanupMethod()
}

我想:

using(new OnDisposed(MyCleanupMethod))
{
    ...
}

在我被斥责之前,出于三个原因:

  • 对于长 try 块,它允许读者在开始时看到需要清理的内容
  • try 暗示它捕获了一个错误(它不是)
  • 保留处置代码private(如果IDisposable对象从类返回)

这是有效的做法吗?如果是这样,是否有一个 .NET 类可以做到这一点?

【问题讨论】:

  • 没有什么可以阻止您自己编写它,但我不得不说“try-finally”是标准的,对 C# 开发人员来说更清晰,并且非常适合您的用例。
  • 你可以自己做。包括一个构造函数参数,该参数是您的对象中实现 IDisosable 的函数。调用 OnDispose 中的函数
  • 我不同意你的第二点,try/finally 是一个非常常见的结构,我怀疑任何有经验的开发人员都会认为你一定会抓住一些东西。但我会发现你的语法也是可以接受的,只要它被一致使用。
  • @Baldrick 相反,不仅习惯使用Dispose 进行清理,而且在.NET 1.1 中添加using 的语言非常普遍。这是一种非常非常普遍的模式。
  • @c-z Dispose 模式非常普遍,以至于 .NET 语言都有特殊的关键字使其更容易(C# 中的using,F# 中的use)。使用 IDisposable 包装资源是一个有效的选择,但如果该资源自己实现 IDisposable 会更好

标签: c# .net dispose idisposable try-finally


【解决方案1】:

您可以添加一个执行该操作的构造函数:

public class OnDisposed : IDisposable
{
    private readonly Action _disposeAction;
    public OnDisposed(Action disposeAction)
    {
        _disposeAction = disposeAction;
    }

    public void Dispose()
    {
        // ...
        if(_disposeAction != null)
            _disposeAction();
    }
}

例如:

using (new OnDisposed(() => Console.WriteLine("Dispose Called")))
{
    Console.WriteLine("In using...");
}

【讨论】:

    猜你喜欢
    • 2013-01-23
    • 1970-01-01
    • 2011-05-02
    • 1970-01-01
    • 2014-10-12
    • 1970-01-01
    • 2020-09-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多