-1

考虑以下示例。

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

在上面的例子中, using 块之外的 sqlConnection 将被释放并收集垃圾

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

在此示例中,sqlConnection对象将在SomeMethod().

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

4

2 回答 2

3

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

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

于 2019-03-15T08:37:50.367 回答
1

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

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

于 2019-03-15T10:56:49.277 回答