如果MyClass实现了IDisposable接口,那么这两个给定的片段是否都正确地处理了MyClass对象?哪种方法比另一种更好?
代码1
public MyModel MethodOne()
{
using (MyClass myClass = new MyClass())
{
var myModel = new MyModel();
myModel.MyModelData = myClass.GetData();
return myModel;
}
}代码2
public MyModel MethodTwo()
{
var myData = new MyData();
using (MyClass myClass = new MyClass())
{
myData = myClass.GetData();
}
var myModel = new MyModel();
myModel.MyModelData = myData;
return myModel;
}发布于 2013-12-04 11:33:31
这是一样的:对象将以两种方式处理。
编译器将using语句转换为try块,后者在finally块中调用Dispose。
finally保证在try块完成执行后执行,而不管它的执行路径如何。
无论如何,都保证调用Dispose。。
参考MSDN
作为一种样式和最佳实践,IMHO最好在不再需要对象时立即释放它,因为您将更早地释放资源,而且如果dispose抛出异常,您的方法将返回任何内容。而且调试也会更容易。
更新
作为KrisVandermotten指出,在某些情况下,最终块将不会执行。
发布于 2013-12-04 11:40:44
using被翻译成带有finally块的try。你的代码
using (MyClass myClass= new MyClass())
{
myData = myClass.GetData();
}是相同的
MyClass myClass= new MyClass();
try
{
myData = myClass.GetData();
}
finally
{
if (myClass != null)
((IDisposable)myClass).Dispose();
}至于哪种方法更可取,这两种解决方案都能很好地工作。第二种方法较早地处理对象,因此在许多情况下更可取。没有必要保留对象,特别是当对象使用外部资源时。
不过,也有例外。您可能希望或需要更长时间地保持对象以实现您的目标,例如在使用事务范围时。此外,有时从可丢弃对象派生的对象(在您的情况下)可能会在释放原始对象时变得无效。
发布于 2013-12-04 11:34:14
在这两种情况下,您都可以依赖这样一个事实:如果构造了MyClass的一个对象并完成了该方法,那么该对象也会被释放。
在后一种情况下,对象的构造要晚于第一种情况,并且它比第一种情况更早地被释放,但是在这两种情况下它都将被释放。
哪种更好些呢?假设一个一次性的对象以某种方式持有需要释放的东西,并且这种对它的坚持是昂贵的,在其他条件相同的情况下,那么最好的方法就是第二种方法。
为什么上面有两个警告呢?
“如果构造了MyClass对象”
在第二种情况下,对new MyData()的调用可能引发异常,甚至不尝试MyClass对象构造。在第一种情况下,构造这个对象是发生的第一件事。它可能会失败,但它会被尝试。当然,在第二种情况下也可能失败。如果失败了,就没有什么可处理的了。
“并且该方法完成”
如果在执行处理之前失去了权力,那么什么都不会被处理,还有一些其他的病理性案例无法保证执行最后的块。
https://stackoverflow.com/questions/20374072
复制相似问题