在C#中使用()vs本地范围对象[重复]

问题描述 投票:-1回答:2

这个问题在这里已有答案:

请考虑以下示例。

public void SomeMethod(){
 using(var sqlConnection= new SQLConnection()){
 //some code here
 }
}

在上面的示例中,将使用using块外部的sqlConnection并进行垃圾回收

public void SomeMethod(){
var sqlConnection = new SQLConnection(){
}
}

在这个例子中,sqlConnection对象将在执行SomeMethod()后被垃圾收集。

这里的问题是,在这种情况下是否真的有必要使用using()作用域,因为我可以在执行结束时收集对象垃圾。有人可以在这里分享你的想法。

c# scope garbage-collection using
2个回答
3
投票

IDisposable与垃圾收集没有任何共同之处。这只是一个契约,说你应该在实现它的对象上调用Dispose,因为它需要进行一些清理。 using声明是一个帮助你的工具。此外,各种工具(即Resharper)可能会注意到您没有在此类Disposable对象上调用Dispose(或使用using)。

垃圾收集只是在不再需要对象后回收内存的另一种机制。在你的情况下,SQLConnection将在方法退出一段时间后被垃圾收集(因为它会注意到任何东西都不再引用它)。


1
投票

一般的答案是:当然最好并建议将usingIDisposable对象一起使用,因为它确保了一些预期的行为,但使用的必要性可能取决于其他因素,例如:正确实施IDisposable模式,无需回收资源立即(也许是因为他们无论如何都会在短期控制台应用程序中被回收,或者因为任何其他原因只为您而知道)。但考虑到这样的事实,在绝大多数情况下这些因素是未知的,我们更愿意采取预防措施,始终尽可能地应用using

更具体地说,正确实现的IDisposable模式确保在显式IDisposable调用期间(即当对象离开Dispose范围时)或在完成阶段(即当GC收集对象时)释放非托管资源(using)。 )。在你的情况下,SQLConnection类型具有正确的IDisposable实现,因此在这种特定情况下应用或不应用using几乎相同。几乎 - 因为你仍然无法确定GC何时开始收集你的对象,而当Dispose抛出异常时你无法处理这种情况。这就是为什么建议和最佳实践是使用using无论如何,但你的问题是关于你的具体情况的必要性,所以基于上面的invormation - 你决定。

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