例如,可以通过以下方式创建一次性资源的新实例:
var resource = CreateNewResource();
以下编码风格有什么区别?
第一种风格:
var resource = CreateNewResource();
using (resource)
{
//Use resource
}
第二种风格:
using (var resource = CreateNewResource())
{
//Use resource
}
如果我们不打算在使用块之外的任何地方使用资源,那么第一种样式是不良编码实践吗?
即使我们希望使用using块之外的资源,是否应鼓励希望使用using块之外的可支配资源?
答案 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)
好的..所以这显然是一种不好的做法。
您可以实例化资源对象,然后将变量传递给 使用声明,但这不是最佳做法。在这种情况下, 控件离开使用块后,对象仍然在范围内 虽然它可能不再能够访问它的非托管 资源。换句话说,它将不再完全初始化。如果 你试图使用using块之外的对象,你冒险导致 被抛出的异常。出于这个原因,通常更好 在using语句中实例化对象并将其范围限制为 使用块。
我在网上看到了这种风格。在我自己的代码中,只要样式2中的资源声明语句很长,我就从using(){}
中取出声明,然后编写样式1中提到的代码,使代码更具可读性。