我想你对以下主题的意见:使用块嘉豪?
假设我们有一个负责实现一个特定目的的方法,但要做到这一点,它需要一个重要的数字支持的本地范围对象,许多其中实施IDisposable
。
MS编码标准说当使用本地IDisposable
对象时,不需要“存活”该方法的范围(不会被返回或不会被分配给某些长期存在的object
的状态信息),您应该使用using
构造。
的问题是,在某些情况下,你可以得到的using
块嵌套“地狱”:
using (var disposableA = new DisposableObjectA())
{
using (var disposableB = new DisposableObjectB())
{
using (var disposableC = new DisposableObjectC())
{
//And so on, you get the idea.
}
}
}
你能以某种方式减轻这一点,如果一些正在使用的对象,从一个共同的基础得到或实施实施IDisposable
的共同interface
。当然,这需要花费一定的代价,只要你需要真正的对象类型就可以投射这些对象。有时候,这可能是可行的,只要铸造量不失控:
using (var disposableA = new DisposableObjectA())
{
using (DisposableBaseObject disposableB = new DisposableObjectB(),
disposableC = new DisposableObjectC)
{
using (var disposableD = new DisposableObjectD())
{
//And so on, you get the idea.
}
}
}
另一种选择是不使用using
块,直接实现try-catch
块。这看起来像:
DisposableObjectA disposableA = null;
DisposableObjectB disposableB = null;
DisposableObjectC disposableC = null;
...
try
{
disposableA = new DisposableObjectA();
....
}
finally
{
if (disposableA != null)
{
disposableA.Dispose();
}
if (disposableB != null)
{
disposableB.Dispose();
}
//and so on
}
有趣的是,VS Code Analyzer会将此代码标记为“错误”。它会通知您,并非所有可能的执行路径都确保所有可丢弃对象在超出范围之前将被丢弃。我只能看到发生这种情况时,如果某些物体在丢弃时抛出,而在我看来永远不会发生的情况下发生,如果它发生了,它通常表示某种事情真的搞糟了,而且您可能比您更快,更优雅地退出可以从你的整个应用程序。
所以,问题是:你更喜欢什么样的方法?不管有多少块,或者超过一定的限制,最好是使用嵌套的using
块,最好是使用try-catch
块?
不确定我会形容嵌套为“地狱”,但一个有效的问题+1 – Jodrell 2011-06-03 12:57:56