gpt4 book ai didi

c# - 使用大量 block ?

转载 作者:太空狗 更新时间:2023-10-29 18:05:34 25 4
gpt4 key购买 nike

我想听听您对以下主题的看法:

假设我们有一个方法负责实现一个特定目的,但要做到这一点,它需要大量局部范围对象的支持,其中许多对象实现了 IDisposable。 .

MS 编码标准说当使用本地 IDisposable 时不需要在方法范围内“存活”的对象(例如,不会返回或不会分配给一些生命周期更长的状态信息 object),您应该使用 using构造。

问题是,在某些情况下,您可能会遇到 using 的嵌套“ hell ”。 block :

using (var disposableA = new DisposableObjectA())
{
using (var disposableB = new DisposableObjectB())
{
using (var disposableC = new DisposableObjectC())
{
//And so on, you get the idea.
}
}
}

如果您使用的某些对象来自公共(public)基础或实现公共(public) interface,您可以以某种方式缓解这种情况。实现 IDisposable .这当然是以必须在需要对象的真实类型时强制转换所述对象为代价的。有时,只要转换的数量不会失控,这就是可行的:

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 block 并直接实现 try-catch block 。这看起来像:

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 代码分析器会将此代码标记为“错误”。它会告诉您,并非所有可能的执行路径都能确保在超出范围之前处理所有一次性对象。我只能看到,如果某些对象在处置时抛出,我认为这永远不会发生,如果确实发生了,这通常表明事情真的搞砸了,你可能最好像你一样快速优雅地退出可以从您的整个应用程序。

那么,问题是:您更喜欢哪种方法?使用嵌套 using 总是更可取吗? block 无论多少,或者超过一定限制,最好使用 try-catch阻止?

最佳答案

如果只有一个语句,则不需要大括号,例如:

using (var disposableA = new DisposableObjectA())
using (var disposableB = new DisposableObjectB())
using (var disposableC = new DisposableObjectC())
{
//And so on, you get the idea.
}

但这确实取决于外部 block 中没有发生任何其他事情。

关于c# - 使用大量 block ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6227264/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com