首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用语句用法

问使用语句用法
EN

Stack Overflow用户
提问于 2013-12-04 11:25:34
回答 4查看 116关注 0票数 3

如果MyClass实现了IDisposable接口,那么这两个给定的片段是否都正确地处理了MyClass对象?哪种方法比另一种更好?

代码1

代码语言:javascript
复制
public MyModel MethodOne()
{
    using (MyClass myClass = new MyClass())
    {
        var myModel = new MyModel();
        myModel.MyModelData = myClass.GetData();

        return myModel;
    }
}

代码2

代码语言:javascript
复制
public MyModel MethodTwo()
{
    var myData = new MyData();

    using (MyClass myClass = new MyClass())
    {
        myData = myClass.GetData();
    }

    var myModel = new MyModel();
    myModel.MyModelData = myData;

    return myModel;
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-12-04 11:33:31

这是一样的:对象将以两种方式处理。

编译器将using语句转换为try块,后者在finally块中调用Dispose。

finally保证在try块完成执行后执行,而不管它的执行路径如何。

无论如何,都保证调用Dispose。。

参考MSDN

作为一种样式和最佳实践,IMHO最好在不再需要对象时立即释放它,因为您将更早地释放资源,而且如果dispose抛出异常,您的方法将返回任何内容。而且调试也会更容易。

更新

作为KrisVandermotten指出,在某些情况下,最终块将不会执行。

  • Environment.FailFast
  • 不可缺少的东西
  • 电源故障
票数 3
EN

Stack Overflow用户

发布于 2013-12-04 11:40:44

using被翻译成带有finally块的try。你的代码

代码语言:javascript
复制
using (MyClass myClass= new MyClass())
{
    myData = myClass.GetData();
}

是相同的

代码语言:javascript
复制
MyClass myClass= new MyClass();
try
{
    myData = myClass.GetData();
}
finally
{
    if (myClass != null)
        ((IDisposable)myClass).Dispose();
}

至于哪种方法更可取,这两种解决方案都能很好地工作。第二种方法较早地处理对象,因此在许多情况下更可取。没有必要保留对象,特别是当对象使用外部资源时。

不过,也有例外。您可能希望或需要更长时间地保持对象以实现您的目标,例如在使用事务范围时。此外,有时从可丢弃对象派生的对象(在您的情况下)可能会在释放原始对象时变得无效。

票数 3
EN

Stack Overflow用户

发布于 2013-12-04 11:34:14

在这两种情况下,您都可以依赖这样一个事实:如果构造了MyClass的一个对象并完成了该方法,那么该对象也会被释放。

在后一种情况下,对象的构造要晚于第一种情况,并且它比第一种情况更早地被释放,但是在这两种情况下它都将被释放。

哪种更好些呢?假设一个一次性的对象以某种方式持有需要释放的东西,并且这种对它的坚持是昂贵的,在其他条件相同的情况下,那么最好的方法就是第二种方法。

为什么上面有两个警告呢?

“如果构造了MyClass对象”

在第二种情况下,对new MyData()的调用可能引发异常,甚至不尝试MyClass对象构造。在第一种情况下,构造这个对象是发生的第一件事。它可能会失败,但它会被尝试。当然,在第二种情况下也可能失败。如果失败了,就没有什么可处理的了。

“并且该方法完成”

如果在执行处理之前失去了权力,那么什么都不会被处理,还有一些其他的病理性案例无法保证执行最后的块。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20374072

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档