在使用块中创建资源与使用块

时间:2016-04-26 16:01:54

标签: c# disposable

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

var resource = CreateNewResource();

以下编码风格有什么区别?

第一种风格:

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

第二种风格:

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

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

即使我们希望使用using块之外的资源,是否应鼓励希望使用using块之外的可支配资源?

2 个答案:

答案 0 :(得分:5)

第一个值得注意的区别在于,在你的第一个片段中,变量资源仍在使用块之后被声明,因此有人可以在它被丢弃后使用它,这是不好的。

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;
    }
}

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

答案 1 :(得分:0)

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

非常好documented on MSDN

  

您可以实例化资源对象,然后将变量传递给   使用声明,但这不是最佳做法。在这种情况下,   控件离开使用块后,对象仍然在范围内   虽然它可能不再能够访问它的非托管   资源。换句话说,它将不再完全初始化。如果   你试图使用using块之外的对象,你冒险导致   被抛出的异常。出于这个原因,通常更好   在using语句中实例化对象并将其范围限制为   使用块。

我在网上看到了这种风格。在我自己的代码中,只要样式2中的资源声明语句很长,我就从using(){}中取出声明,然后编写样式1中提到的代码,使代码更具可读性。