Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 初始化外部或内部的一次性资源try/finally_C#_Java_Coding Style_Resources - Fatal编程技术网

C# 初始化外部或内部的一次性资源try/finally

C# 初始化外部或内部的一次性资源try/finally,c#,java,coding-style,resources,C#,Java,Coding Style,Resources,我看到了获取和处置资源的两种方式。要么: Resource resource = getResource(); try { /* do something with resource */ } finally { resource.close(); } 或: 我想知道哪种款式比较好。第一种方法避免了if条件,而第二种方法(我认为)在赋值之后但在进入try块之前处理线程中止的情况。这些风格之间还有哪些优点和缺点?我最好使用哪一个?如果getResource()引发异常,则resource将为nu

我看到了获取和处置资源的两种方式。要么:

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

我想知道哪种款式比较好。第一种方法避免了
if
条件,而第二种方法(我认为)在赋值之后但在进入
try
块之前处理线程中止的情况。这些风格之间还有哪些优点和缺点?我最好使用哪一个?

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

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

using (Resource resource = GetResource())
{
    /* Do something */
}
这是清理资源的惯用方法,并且依赖于所讨论的资源实现
IDisposable
接口。(Java现在有一个类似的try with resources语句,用于实现
AutoCloseable
)的资源


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

第一个更可取

但是没有必要对第一个版本执行此操作-如果引发异常,您将无法到达finally块。在类似的代码中,例如,获取并释放锁,获取失败将导致不匹配的释放。谢谢。C#的using关键字很好,但有时不能使用它(例如,与未实现IDisposable的类型一起使用,或者当应该有条件地调用Dispose()时)。至于Java,我实际上没有处理此类问题的经验,但是线程不能被中断吗?它们可以被中断(安全地),如果您编写代码允许它,真正发生的是线程可以得到需要中断的信号,在线程代码上,您决定如何停止当前正在执行的工作是的,但至少他们不会在输入try块之前中断post赋值。这是最重要的一点:)我可以问你怎么知道它们不会在分配和尝试之间被中断?@Hosam:正如我所说的,我还没有在规范中找到它,但是请注意InterruptedException是一个选中的异常,所以它不能被抛出任何地方。我相信在某些地方,它被记录为只在阻塞操作(等待/睡眠/IO等)期间抛出。
using (Resource resource = GetResource())
{
    /* Do something */
}