【问题标题】:Is it bad to nullify objects in Finally? [duplicate]在finally中使对象无效是不是很糟糕? [复制]
【发布时间】:2016-08-10 15:29:56
【问题描述】:

我已经看到开发人员在他们编写的几乎所有方法中都尝试、捕获和 finally,并且他们取消了他们在 finally 块中创建的对象。

例如-

     public void Demo()
     {
        Something s = null;
        try
        {
            s = new Something();
        }
        catch (Exception ex)
        {

            throw;
        }
        finally
        {
            s = null;
        }
     }

这样做有什么用吗?这样做的建议是使对象无效,以便 GC 可以收集它们。

如果不这样做,我们可以使用“using”或IDisposable来代替吗?

最佳做法是什么?

【问题讨论】:

    标签: c# oop exception-handling


    【解决方案1】:

    将对象设置为 null 不会做任何事情,因为它会超出范围。因此,简短的回答是肯定的,这很糟糕。您添加的代码没有增加任何价值,最终将成为其他程序员必须阅读的内容,充其量只是删除。它也可能使其他程序员混淆你为什么这样做。

    在您的示例中,您还扩展了对象的范围,以便您可以在 finally 块中将其设为空。理想情况下,您应该在 try 块中声明它,并让它超出范围。

    【讨论】:

    • 所以如果 finally 被删除(假设没有使用“使用”),对象将如何被释放?
    • .NET 有一个垃圾收集器。当不再使用对象时,运行时环境将在适当的时候处理它的删除。
    【解决方案2】:

    一旦您的方法返回,引用 s 将可用于 GC。您可以使用 using 块(假设您的对象实现 IDisposable)来保证在发生错误时释放对象,这类似于您的 finally 块。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-20
      • 2010-10-30
      • 2011-10-06
      • 2022-01-24
      • 2011-05-23
      • 2018-01-20
      • 2022-07-21
      • 1970-01-01
      相关资源
      最近更新 更多