我见过两种获取和处置资源的方式。要么:
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
块之前线程中止的情况。这些风格相对于彼此还有哪些其他优点和缺点?我应该优先使用哪一个?
在C#中,只需使用using语句即可:
using (Resource resource = GetResource())
{
/* Do something */
}
或者从 C# 8.0 开始,您还可以选择 using 声明,它与上面类似,但隐式跨越到当前范围的末尾:
using Resource resource = GetResource();
/* Do something */
这是清理资源的惯用方法,并依赖于实现
IDisposable
接口的相关资源。 (Java 现在有一个类似的 try-with-resources 语句,用于实现 AutoCloseable
的资源。)
Java 中在赋值和进入 try 块之间不存在线程中止的风险 - 中止仅发生在睡眠和等待期间。编辑:我实际上在规范中找不到这个,这有点令人担忧。嗯。
第一个更好
如果 getResource() 抛出异常,则 resource 将为 null,getResource() 在异常情况下不会返回任何内容。因此,只要 getResource() 可以抛出异常,请在调用 resource.close() 之前始终检查是否为 null。我觉得组织这段代码的最好方法是将所有内容都放在 try 块中;明确指出 getResource() 会抛出异常。