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

问题描述 投票:0回答:3

我见过两种获取和处置资源的方式。要么:

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# java coding-style resources
3个回答
17
投票

在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 块之间不存在线程中止的风险 - 中止仅发生在睡眠和等待期间。编辑:我实际上在规范中找不到这个,这有点令人担忧。嗯。


4
投票

第一个更好


-1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.