【问题标题】:Does a using block keep an object alive?using 块是否使对象保持活动状态?
【发布时间】:2012-11-19 12:35:05
【问题描述】:

对于某些单元测试,我想将 CurrentCulture 设置为特定的文化(然后稍后再反转这些更改)。由于我需要在几个地方这样做,我正在考虑编写一个 CultureChanger 类,它保存旧文化并在其构造函数中设置新文化,然后在处理过程中重置旧文化。

然后我可以这样使用它:

using(new CultureChanger(culture)){  
    //some code and assertions with no references to the CultureChanger 
}

如果我这样做了,CultureChanger 是否有可能在 using 块完成之前被清理掉?

【问题讨论】:

    标签: c# using object-lifetime


    【解决方案1】:

    CultureChanger 直到 using 块“完成”后才会被清理。

    using 块定义对象的范围,其方式与方法的作用大致相同。

    无法保证何时在块执行后对象会被垃圾回收,但之前不会发生。

    【讨论】:

    • 即使有一些很棒的优化,还是没有?或者更确切地说 - using 声明 保证 在 using 完成之前不处置对象?
    • 如果你想在块结束的时候专门执行一些东西,让类实现IDisposable
    • @Default - 即使有很棒的优化。
    • @RenéWolferink 你不能在没有实现IDisposable 的类上使用using 对吧?
    • 只是一个问题,但是您写了“与方法相同的方式”,但是方法通常将值存储在变量中,在这种情况下为参数,但此处不可用。所以我们似乎没有根对象,哪个对象持有对 CultureChanger 的引用?
    【解决方案2】:

    using statement 提供了一种方便的语法,可确保正确使用 IDisposable 对象。

    using 语句以正确的方式调用对象的 Dispose 方法,并且(当您如前所示使用它时)它还会导致对象本身在调用 Dispose 时立即超出范围。在 using 块中,对象是只读的,不能修改或重新分配。

    using 语句确保 Dispose 被调用,即使 在对象上调用方法时发生异常。

    【讨论】:

      【解决方案3】:

      CultureChanger 实例将在整个 using 块中保持“活动”,并且其 Dispose 方法将在 using statemnet 的右花括号 '}' 上调用。所以你的问题的答案是:CultureChanger 没有被清理的风险。

      【讨论】:

        猜你喜欢
        • 2013-06-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-09
        • 1970-01-01
        • 2019-03-21
        • 1970-01-01
        相关资源
        最近更新 更多