在 Using 块之外访问一次性对象的未处置资源

Access Undisposed Resource of a Disposable Object Outside of Using Block

下面的代码是完全合法的。

DisposableObject disposableObject;
...
using (disposableObject = new DisposableObject(...))
{
     disposableObject.UseDisposableResource();
}
...
var result = disposableObject.AccessUndisposedResource();

Q利用它还是保持清醒?

我绝对会避开这一点。通常的约定是仅在 using 语句的范围内引入变量,否则会使开发人员感到困惑并且很难找到错误。

如果开发人员希望如此,按照惯例:

using (DisposableObject disposableObject = new DisposableObject())
{
    ...
}

然后打破惯例将导致最好的代码看起来很奇怪,最坏的情况下会很奇怪 behaviour/bugs。

根据我的经验,using 语句的典型用法在 developer 期望中与以下内容非常相似(即使它是范围更改,而不是一个对象的归零):

DisposableObject disposableObject = new DisposableObject();

...
disposableObject.Dispose();
disposableObject = null;

如果我手下的开发者做过这样的事,我会劝他们停止!我还会更改我发现的所有实例,因为它有这样的代码味道,并且很有可能导致难以 find/understand 的错误。

我不会使用它,因为阅读您的代码的任何人都会认为 using 之后 disposableObject 的用法是 可用对象 .

我会按照其他人的建议将一次性对象的范围保持在 using 块的范围内。

这里涉及到一些规范/期望:

  1. 处置后的对象通常被视为已完成并假定在处置后无法使用(尽管不是编译器强制执行的)
  2. using 变量通常在 using 语句中声明,这会在它们被释放时明确阻止使用(同样,不是编译器强制执行的)

您的代码违反了这两个规范 - 您有一个已处置的对象,该对象仍有望使用,还有一个 using 块,该块处置了一个外部变量,该外部变量在该块之后仍保留在范围内。结果?代码混乱,难以阅读和维护。

所以是的,请避开。

在这种情况下,使用 using-block 有点误导。我个人只在块内使用 disposableObject,并将 AccessUndisposedResource()-逻辑拆分到其他对象。

可能是这样的:

ResultType result = null;
using (DisposableObject disposableObject = new DisposableObject(...))
{
   disposableObject.UseDisposableResource();
   ...
   result = disposableObject.AccessUndisposedResource();
}
...
// Now we can access the undisposed resource here with 'result'-variable