c# - 使用泛型和 IDisposable 指南

标签 c# c#-4.0

在 More Effective C# 的第 5 项中,介绍了以下内容:

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

这里的目标是正确处理驱动器,如果它实现了 IDisposable。这是有道理的,但是这个实现与更简洁的实现有何不同:

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

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

最佳答案

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

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

关于c# - 使用泛型和 IDisposable 指南,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4081061/

相关文章:

c# - 当连接条件类似时如何在 EF 中进行连接

c#-4.0 - Azure 上的 Hadoop C#同位素

c# - 序列化/反序列化为字符串 C#

c# - 使用 MSI 将 .NET 程序集安装到 GAC

c# - 从链中删除代表

c# - 使用 C# 执行命令行

regex - 仅当字符串中没有 "\r\n"时才替换 "."的正则表达式

c# - 为什么线程之间意外共享 ThreadStatic 数据?

c# - EntityType 没有键定义错误

c# - 使用字典中的抽象泛型类作为值而不具体说明类型