在try / finally外部或内部初始化一次性资源

时间:2009-01-20 20:47:01

标签: c# java coding-style resources

我已经看到了两种获取和处理资源的方法。之一:

Resource resource = getResource();
try { /* do something with resource */ }
finally { resource.close(); }

或:

Resource resource = null;
try { resource = getResource(); /* do something with resource */ }
finally { if (resource != null) resource.close(); }

我想知道哪种风格更合适。第一个避免if条件,而第二个(我假设)在赋值之后但在进入try块之前处理线程中止的情况。这些风格有什么其他优点和缺点?我最好使用哪一个?

3 个答案:

答案 0 :(得分:6)

在C#中,只需使用using语句:

using (Resource resource = GetResource())
{
    /* Do something */
}

在分配和进入try块之间不存在Java线程中止的风险 - 中止只发生在休眠和等待期间。编辑:我实际上无法在规范中找到这个,这有点令人担忧。 HMM。

答案 1 :(得分:4)

第一个是优选的

答案 2 :(得分:-1)

如果 getResource()抛出异常,则 resource 将为null, getResource()在异常的情况下不返回任何内容。因此,只要 getResource()可以抛出异常,在调用 resource.close()之前总是检查null。我觉得组织这段代码的最好方法是将所有内容放在try块中;清楚地表明 getResource()会抛出异常。