对每个实现 IDisposable 的对象使用 "using" 语句?

Using "using" statements for every object implementing IDisposable?

我目前正在浏览一些读取 Active Directory 条目并对其进行操作的代码。因为我不必处理这类事情,所以我 F12'd the 类 (DirectoryEntry, SearchResultCollection, ... ),我发现它们都实现了 IDisposable 接口,但我在代码中看不到任何 using 块。

在这种情况下这些是否必要(即,我是否应该盲目地重构它们)?

关于这个我的另一个问题(代码中有很多实例化的 IDisposable 对象:在这种情况下 IDisposable 不是很 "ugly" 吗?我的意思是,我喜欢 using 语句,因为它们基本上让我不用担心事情,但在很多情况下,代码的布局类似于以下内容:

using (var one = myObject.GetSomeDisposableObject())
using (var two = myObject.GetSomeOtherDisposableObject())
{
  one.DoSomething();
  using (var foo = new DisposableFoo())
  {
    MyMethod(foo);
    using (...)
    using (...)
    {
      ...
    }
  }
}

我觉得由于高缩进级别(甚至堆叠 using 语句),这变得很难读。但是将其中一些提取到新方法中可能会导致需要传递许多参数,因为 "inner" 代码通常需要在 using 语句中创建的对象。

在不损失可读性的情况下解决这个问题的优雅方法是什么?

对于第一部分,this question在不处理AD引用的情况下引用'memory used by the task increasing constantly'

对于第二个,using 块是 try/finally 的语法糖,在 finally 块中调用 Dispose,这将是一个替代结构,允许你把所有东西都放在一个地方,减少缩进