在 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
块的范围内。
这里涉及到一些规范/期望:
- 处置后的对象通常被视为已完成并假定在处置后无法使用(尽管不是编译器强制执行的)
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
下面的代码是完全合法的。
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
块的范围内。
这里涉及到一些规范/期望:
- 处置后的对象通常被视为已完成并假定在处置后无法使用(尽管不是编译器强制执行的)
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