【问题标题】:Cleaning up class level variables in Dispose method在 Dispose 方法中清理类级变量
【发布时间】:2015-09-05 23:31:39
【问题描述】:

变量userManagersignInManager 都是可以实例化的类级实例成员,也可以为空。

替换它是否安全:

protected override void Dispose(bool disposing)
{
    if (disposing)
    {
        if (this.userManager != null)
        {
            this.userManager.Dispose();
            this.userManager = null;
        }

        if (this.signInManager != null)
        {
            this.signInManager.Dispose();
            this.signInManager = null;
        }
    }

    base.Dispose(disposing);
}

用这个:

protected override void Dispose(bool disposing)
{
    if (disposing)
    {
        this.userManager?.Dispose();
        this.signInManager?.Dispose();
    }

    base.Dispose(disposing);
}

就我个人而言,我没有看到在处理变量后将变量显式分配给 null 的意义,因为它们不是静态的,据我所知,它没有做任何事情。

【问题讨论】:

  • Dispose() 方法可能会被多次调用。在某些情况下,派生自 Stream 的类非常常见。它仍然有效吗?如果没有,那么它是不安全的。
  • 我想? 只是一个语法糖。可能会生成与上面相同的代码。至于分配 null:这是一个很好的问题。这对GC有什么影响吗? (我也很好奇,但我猜确实如此,尤其是如果你的课程有终结器)
  • nulling 变量会删除对象之间的引用,因此理论上可以重温 GC - 更小的图形、更少的周期、更低的不必要提升到 gen+1 的机会等 - 但除非你有无数这样对象,除非您经常创建&gc 它们,否则您可能不会注意到性能差异。我个人喜欢null 他们只是为了让Disposed 状态“更加独特” - 并非所有伴随的对象都会在离开时抛出ObjectDisposedExcpt,保证OTOH NullReferenceExcpt。但这取决于.. 有时 nullreference 会产生误导

标签: c# dispose c#-6.0 null-conditional-operator


【解决方案1】:

代码是安全的,因为它不能抛出空引用异常。但它不是 100% 等效的,因为您仍然需要在处理后将引用设置为 null。这可能并不重要,但在某些情况下,如果包含对象在被释放后仍留在范围内,它可以帮助垃圾收集器。

this.userManager?.Dispose();
this.userManager = null;
this.signInManager?.Dispose();
this.signInManager = null;

【讨论】:

  • 你的意思是ref IDisposable memeber
  • 接口是引用类型,那真的有必要吗?无论哪种方式,考虑一下,除非有大量成员需要处理,否则我可能不会创建这样的方法。
  • 在您发表评论后,我会 -1 .. 但是,我现在是凌晨 2:00,所以也许在您的时区,您也已经累了.. "参数列表中的“引用类型”/“值类型”(类/结构)和“按引用传递”/“按值传递”(ref/no ref)。您是否尝试过像在该代码中那样为方法的参数分配新值?如果没有,请尝试,并在添加ref 之前观察被调用者的值如何不要更改
  • Welp,你说得对,我怪天气。删除了非工作部分,但其余部分仍然存在。
【解决方案2】:

This has been Answered

您不需要将对象设置为 null。 当您处理一个对象时,它将由 GC(垃圾收集器)处理

【讨论】:

    猜你喜欢
    • 2019-03-05
    • 1970-01-01
    • 2018-06-13
    • 1970-01-01
    • 2010-09-21
    • 2021-06-06
    • 2019-06-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多