以下代码完全合法。
DisposableObject disposableObject;
...
using (disposableObject = new DisposableObject(...))
{
disposableObject.UseDisposableResource();
}
...
var result = disposableObject.AccessUndisposedResource();
问使用它还是保持清醒?
答案 0 :(得分:3)
我绝对会避开这一点。通常的惯例是仅在using语句的范围内引入变量,否则要求开发人员混淆并且很难找到错误。
如果开发人员按照惯例期望这样做:
using (DisposableObject disposableObject = new DisposableObject())
{
...
}
然后打破常规会导致奇怪的代码充其量,最糟糕的是奇怪的行为/错误。
根据我的经验,using
语句的典型用法在开发人员期望中与以下内容非常相似(即使它是范围更改,而不是对象的归零) ):
DisposableObject disposableObject = new DisposableObject();
...
disposableObject.Dispose();
disposableObject = null;
如果我照顾的开发人员做过这样的事情,我会告诉他们停止和停止!我也会改变我发现的所有实例,因为它有这样的代码味道,并且很有可能导致很难找到/理解错误。
答案 1 :(得分:2)
这里涉及一些规范/期望:
using
变量通常在using语句中声明,它们在处理它们时会明显地阻止使用(同样,不是编译器强制执行)您的代码违反了这两个规范 - 您有一个仍然可以使用的已处置对象,以及一个处理块后面的外部变量的使用块。结果?困惑和难以阅读和维护的代码。
所以是的,明确指出。
答案 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