0

例如,可以通过以下方式创建一次性资源的新实例:

var resource = CreateNewResource();

以下编码风格有什么区别(如果有的话)?

第一种风格:

var resource = CreateNewResource();
using (resource)
{
    //Use resource
}

第二种风格:

using (var resource = CreateNewResource())
{
    //Use resource
}

如果我们不打算在 using 块之外的任何地方使用资源,那么第一种样式是不好的编码实践吗?

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

4

2 回答 2

5

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

var resource = CreateNewResource();
using (resource)
{
    //Use resource
}
...
// Unknowingly continues to use resource
resource.BadActOnDisposedObject();

如果您决定更自由地使用和分配您的资源,我建议您使用 try/finally,如下所示:

Resource resource = null;
try
{
    // do whatever
    resource = CreateNewResource();
    // continue to do whatever
}
finally
{
    if (resource != null)
    {
        resource.Dispose();
        resource = null;
    }
}

这保证了您的资源在任何情况下都会被处理掉。

于 2016-04-26T16:06:02.830 回答
0

好的..所以这显然是一个不好的做法。

在 MSDN 上有很好的记录:

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

我在网上的某个地方看到了这种风格。在我自己的代码中,每当样式 2 中的资源声明语句很长时,我就将声明拉出来,using(){}然后按照样式 1 中的方式编写代码,以使代码更具可读性。

于 2016-04-26T16:26:17.827 回答