自动处置延期方式合理吗?

Gib*_*nag 4 .net c# extension-methods dispose

我一直在编写一些自定义 WinForm 控件,这些控件执行大量绘图,因此往往有大量基于一次性图形的字段(画笔、笔、位图等),因此我的控件的 Dispose()方法必须对每个方法调用 Dispose。

我担心我(或未来的维护者)很容易错过需要处理的字段,要么忘记处理它,要么没有意识到它实现了 IDisposable。因此,我在 Object 上编写了一个非常简单的扩展方法,它查找所有 IDisposable 字段并处理它们:

static public void DisposeAll(this Object obj)
{
   var disposable = obj.GetType()
                       .GetFields(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance)
                       .Select(fi => fi.GetValue(obj))
                       .Where(o => o != null && o is IDisposable)
                       .Cast<IDisposable>();

   foreach (var d in disposable) d.Dispose();
}
Run Code Online (Sandbox Code Playgroud)

我的问题基本上是这是否合理。我想不出它可能会搞砸什么,但是我对 WinForms 的内部工作原理并不是特别熟悉,这似乎是一种可能会导致令人恼火的错误的事情(扰乱反射和处置)。

Hen*_*rik 5

通常您不想处置所有一次性成员。例如对父表单的引用。