using()与C#中的局部范围对象

时间:2019-03-15 08:24:58

标签: c# scope garbage-collection using

请考虑以下示例。

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

在上面的示例中,将使用using块之外的sqlConnection进行处理并收集垃圾

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

在此示例中,sqlConnection对象将在执行SomeMethod()之后被垃圾回收。

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

2 个答案:

答案 0 :(得分:3)

IDisposable与垃圾回收没有什么共同之处。只是合同,您应该在实现它的对象上调用Dispose,因为它需要进行一些清理。 using语句是一个帮助您的工具。此外,各种工具(例如Resharper)可能会注意到您没有在此类 Disposable 对象上调用Dispose(或使用using)。

垃圾回收只是在不再需要对象之后回收内存的另一种机制。对于您而言,SQLConnection将在方法退出一段时间后被垃圾回收(因为它将注意到不再有任何引用)。

答案 1 :(得分:1)

一般的答案是:当然,将usingIDisposable对象一起使用是可取的推荐的,因为这样可以确保某些预期的行为,但是必要性的使用可能取决于其他因素,例如:IDisposable模式的正确实施以及无需立即回收资源(可能是因为短期内将很快回收这些资源)控制台应用程序或仅因您而闻名的其他任何原因)。但是考虑到实际上在大多数情况下这些因素都是未知的事实,我们希望采取预防措施,始终在可能的情况下始终使用using

更具体地说,正确实现的IDisposable模式可确保在显式IDisposable调用期间(即当对象离开{{时)释放非托管资源(Dispose即将被使用)。 1}}作用域)或在完成阶段(也就是GC收集对象时)。在您的情况下,using类型具有正确的SQLConnection实现,因此在此特定情况下应用或不应用IDisposable几乎是相同的。差不多-因为您仍然无法确定GC何时开始收集您的对象,并且当using引发异常时您无法处理这种情况。这就是为什么建议和最佳实践是无论如何都使用Dispose的原因,但是您的问题是关于您的特定情况的必要性,因此请根据上面的说明由您决定。