在更有效的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
实现它.
使用可用的工具是很重要的.编译您提出的代码.我等几分钟.
好的,你回来了.是的,你需要添加IDisposable的约束,使using语句总是能够处置的对象.从这本书中的代码是围绕制约黑客攻击,它将如果T没有实现IDisposable甚至工作.using(null){}有效.
归档时间: |
|
查看次数: |
1011 次 |
最近记录: |