C#有using
语句,专门用于IDisposable对象。据推测,在using
语句中指定的任何对象都将持有某种应该被确定性释放的资源。
然而,在编程中有许多设计具有单一、明确的开始和结束,但却缺乏内在的语言支持。 using
结构提供了使用代码编辑器的内置功能来至少清晰自然地突出这种设计或操作范围的机会。
我所考虑的是那些经常以BeginXXX()
和EndXXX()
方法开始的操作,尽管有许多不同的变体,例如涉及“开始”和“加入”的异步代码执行。
以这个天真的例子为例。
webDataOperation.Start();
GetContentFromHardDrive();
webDataOperation.Join();
// Perform operation that requires data from both sources
如果相反,Start方法返回一个对象,该对象的IDisposable.Dispose
方法执行连接操作会怎么样。
using(webDataOperation.Start()) {
GetContentFromHardDrive();
}
// Perform operation that requires data from both sources
更好的是,我特别想到的是:我有一个执行高度专业化图形混合的对象,并且有一个 Begin()
和 End()
方法(这种设计也存在于DirectX和XNA中)。而不是...
using(blitter.BlitOperation()) {
// Do work
}
// Use result
看起来更加自然、易读,但这样做是否不可取,因为它使用了IDisposable
接口和using
语句的非预期用途?换句话说,这是否与以一种非直观的方式重载运算符相当?