访问使用块之外的一次性对象的未释放资源

时间:2015-05-22 12:54:36

标签: c# using-statement

以下代码完全合法。

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

使用它还是保持清醒?

4 个答案:

答案 0 :(得分:3)

我绝对会避开这一点。通常的惯例是仅在using语句的范围内引入变量,否则要求开发人员混淆并且很难找到错误。

如果开发人员按照惯例期望这样做:

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

然后打破常规会导致奇怪的代码充其量,最糟糕的是奇怪的行为/错误。

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

DisposableObject disposableObject = new DisposableObject();

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

如果我照顾的开发人员做过这样的事情,我会告诉他们停止和停止!我也会改变我发现的所有实例,因为它有这样的代码味道,并且很有可能导致很难找到/理解错误。

答案 1 :(得分:2)

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

  1. 被处置的对象通常被认为已经完成并且在处理后被假定为不可用(尽管不是编译器强制执行的)
  2. using变量通常在using语句中声明,它们在处理它们时会明显地阻止使用(同样,不是编译器强制执行)
  3. 您的代码违反了这两个规范 - 您有一个仍然可以使用的已处置对象,以及一个处理块后面的外部变量的使用块。结果?困惑和难以阅读和维护的代码。

    所以是的,明确指出。

答案 2 :(得分:1)

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

我会像其他人所建议的那样,将一次性物品的范围保持在using区域的范围内。

答案 3 :(得分:1)

在这种情况下,使用using - 块有点误导。我个人仅在块内使用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