C# 清理Dispose方法中的类级变量

C# 清理Dispose方法中的类级变量,c#,dispose,c#-6.0,null-conditional-operator,C#,Dispose,C# 6.0,Null Conditional Operator,变量userManager和signInManager都是类级实例成员,可以实例化,也可以为null 更换此部件是否安全: protected override void Dispose(bool disposing) { if (disposing) { if (this.userManager != null) { this.userManager.Dispose(); this.userMana

变量
userManager
signInManager
都是类级实例成员,可以实例化,也可以为null

更换此部件是否安全:

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有什么意义,因为它们不是静态的,据我所知,它什么都不做。

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

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

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

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

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

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

Dispose()方法可能会被多次调用。在某些情况下,从流派生的类非常常见。它还能用吗?如果它不这样做,那么它就不安全。我可以想象,
只是一种语法糖。可能生成与上面相同的代码。至于赋值null:这是一个好问题。这对GC有什么影响吗?(我也很好奇,但我猜确实如此,特别是如果你的类有一个终结器)
null
ing变量会删除对象之间的引用,因此理论上重新定义GC-更小的图,更少的循环,不必要的升级到gen+1的机会更低,等等——但除非您有无数个这样的对象,并且除非您经常创建和gc它们,否则您可能不会注意到性能的差异。我个人喜欢
null
它们只是为了使
Disposed
状态“更独特”——并不是所有伴随的对象都抛出
objectdisposedexct
,当离开后,OTOH
nullreferenceexpt
是有保证的。但这要视情况而定。。有时nullreference会误导Dispose()方法可能会被多次调用。在某些情况下,从流派生的类非常常见。它还能用吗?如果它不这样做,那么它就不安全。我可以想象,
只是一种语法糖。可能生成与上面相同的代码。至于赋值null:这是一个好问题。这对GC有什么影响吗?(我也很好奇,但我猜确实如此,特别是如果你的类有一个终结器)
null
ing变量会删除对象之间的引用,因此理论上重新定义GC-更小的图,更少的循环,不必要的升级到gen+1的机会更低,等等——但除非您有无数个这样的对象,并且除非您经常创建和gc它们,否则您可能不会注意到性能的差异。我个人喜欢
null
它们只是为了使
Disposed
状态“更独特”——并不是所有伴随的对象都抛出
objectdisposedexct
,当离开后,OTOH
nullreferenceexpt
是有保证的。但这要视情况而定。。有时nullreference会误导您的意思是
ref IDisposable memeber
?接口是引用类型,所以这真的是必要的吗?不管怎样,考虑一下,除非有大量的成员需要处理,否则我可能不会创建这样的方法。。但是,现在是凌晨2点在我的住处,所以也许在你的时区你也已经累了。。参数列表中的“引用类型”/“值类型”(类/结构)和“按引用传递”/“按值传递”(引用/无引用)之间存在巨大差异。你们有并没有试过像代码中那个样给方法的参数赋值?如果没有,请尝试,并请观察被调用方的值如何在添加
ref
之前保持不变。好吧,你说得绝对正确,我归咎于天气。删除了非工作部分,但其余部分仍然有效。您的意思是
ref IDisposable memeber
?接口是引用类型,所以这真的有必要吗?不管怎样,考虑一下,除非有大量的成员需要处理,否则我可能不会创建这样的方法。。但是,现在是凌晨2点在我的住处,所以也许在你的时区你也已经累了。。参数列表中的“引用类型”/“值类型”(类/结构)和“按引用传递”/“按值传递”(引用/无引用)之间存在巨大差异。你们有并没有试过像代码中那个样给方法的参数赋值?如果没有,请尝试,并请观察被调用方的值如何在添加
ref
之前保持不变。好吧,你说得绝对正确,我归咎于天气。移除了非工作部分,但其余部分仍保持不变。