首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在using块和using块外部创建资源

在using块和using块外部创建资源
EN

Stack Overflow用户
提问于 2016-04-26 16:01:54
回答 2查看 281关注 0票数 0

例如,可以通过以下方法创建可支配资源的新实例:

代码语言:javascript
复制
var resource = CreateNewResource();

在下面的编码样式中,如果有的话,有什么不同?

第一种风格:

代码语言:javascript
复制
var resource = CreateNewResource();
using (resource)
{
    //Use resource
}

第二种风格:

代码语言:javascript
复制
using (var resource = CreateNewResource())
{
    //Use resource
}

如果我们不打算在using块之外的任何地方使用资源,那么第一种类型的编码实践是否很糟糕?

即使我们希望使用using块之外的资源,是否应该鼓励在using块之外使用一次性资源呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-04-26 16:06:02

第一个值得注意的区别是,在第一个代码段中,变量资源仍然是在using块之后声明的,因此在释放它之后,有人可以使用它,这是不好的。

代码语言:javascript
复制
var resource = CreateNewResource();
using (resource)
{
    //Use resource
}
...
// Unknowingly continues to use resource
resource.BadActOnDisposedObject();

如果您确实想更自由地使用和分配资源,我建议您使用“尝试/最后”,如下所示:

代码语言:javascript
复制
Resource resource = null;
try
{
    // do whatever
    resource = CreateNewResource();
    // continue to do whatever
}
finally
{
    if (resource != null)
    {
        resource.Dispose();
        resource = null;
    }
}

这可以保证您的资源在任何情况下都会得到处理。

票数 5
EN

Stack Overflow用户

发布于 2016-04-26 16:26:17

好的..。因此,这显然是一种糟糕的做法。

相当不错的记录在MSDN上

您可以实例化资源对象,然后将变量传递给using语句,但这不是最佳实践。在这种情况下,即使对象可能不再访问其非托管资源,但在控件离开using块之后,对象仍然在作用域内。换句话说,它将不再被完全初始化。如果尝试在using块之外使用对象,则可能会引发异常。因此,通常最好在using语句中实例化对象,并将其作用域限制在using块上。

我在网上看到了这种风格。在我自己的代码中,每当样式2中的资源声明语句非常长时,我就从using(){}中提取声明,然后编写样式1中提到的代码,以提高代码的可读性。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36870131

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档