使用泛型和IDisposable指南

Mic*_*eyn 4 c# c#-4.0

在更有效的C#的第5项中,提供了以下内容:

public class EngineDriver<T> where T : IEngine, new()
{
  public void GetThingsDone()
  {
    T driver = new T();
    using (driver as IDisposable)
    {
      driver.DoWork();
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

这里的目标是妥善处理驱动器,如果它实现的话IDisposable.这是有道理的,但这种实现与更简洁的方式有何不同:

public class EngineDriver<T> where T : IEngine, new()
{
  public void GetThingsDone()
  {
    using (T driver = new T())
    {
      driver.DoWork();
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

上面的代码不应该以完全相同的方式运行吗?事实上,驱动程序的生命周期超出了使用块,但是驱动程序在所述块的末尾被处理掉了,原始代码是不是很危险

Lee*_*Lee 10

不,因为T不一定实现IDisposable(除非IEngine它自己实现它) - 第二个在这种情况下不会编译,而第一个将.

关于驱动程序的范围 - 在第二个示例中的使用块之后仍然可以访问它并不理想,并且尝试这样做通常会导致异常.理想情况下,您应该IEngine实现IDisposable或添加一个额外的约束来EngineDriver实现它.


Han*_*ant 7

使用可用的工具是很重要的.编译您提出的代码.我等几分钟.

好的,你回来了.是的,你需要添加IDisposable的约束,使using语句总是能够处置的对象.从这本书中的代码是围绕制约黑客攻击,它将如果T没有实现IDisposable甚至工作.using(null){}有效.