【问题标题】:using() vs local scope object in C# [duplicate]using() 与 C# 中的本地范围对象 [重复]
【发布时间】:2019-03-15 08:24:58
【问题描述】:

考虑以下示例。

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

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

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

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

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

【问题讨论】:

  • 只是观察一下,sqlConnection 将在方法执行后在某个时候被垃圾收集。 using 语句确保该对象的 Dispose 方法将被确定性地调用,而不是等待 GC 执行来处理和收集它。
  • object will be garbage collected after 之后紧接着不同。从技术上讲,我出生后就死了。 但过了多久?

标签: c# scope garbage-collection using


【解决方案1】:

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

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

【讨论】:

  • 如果我可以对自己的答案投反对票,我会投反对票的,因为这样我会反对你的
  • @MichaelRandall 哈哈,要是我能对已删除的答案投赞成票就好了;)
【解决方案2】:

一般的答案是:当然首选推荐usingIDisposable对象一起使用,因为它确保了一些预期的行为,但是使用的必要性可能取决于其他因素,例如:IDisposable 模式的正确实现以及不需要立即回收资源(可能是因为它们将在短期控制台应用程序中很快被回收,或者因为任何只有您知道的其他原因)。但考虑到在绝大多数情况下这些因素是未知的,我们宁愿采取预防措施,尽可能使用using

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

【讨论】:

    猜你喜欢
    • 2012-06-11
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 2012-09-13
    • 1970-01-01
    • 2018-06-07
    • 2013-10-26
    • 2013-06-18
    相关资源
    最近更新 更多