在 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/