2015-09-05 56 views
1

變量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); 
} 

個人而言,我沒有看到他們處置後明確地分配變量空的點,因爲它們是不是靜態的,據我所知,它什麼都不做。

+0

Dispose()方法可能會被多次調用。在某些情況下,這是非常普遍的,從Stream派生的類。它仍然有效嗎?如果它不那麼它是不安全的。 –

+0

我想'''只是一個語法糖。可能會生成與上面相同的代碼。至於分配null:這是一個很好的問題。這對GC有什麼影響嗎? (我很好奇,但我猜它確實如此,尤其是如果你的班級有終結者) – ziya

+0

'null'變量刪除對象之間的引用,因此理論上重新使用GC - 更小的圖形,更少的週期,更少的機會不必要的升級到gen + 1等 - 但除非你擁有無數的這些對象,除非你經常創建&gc,否則你可能不會注意到性能的差異。我個人喜歡''null'它們只是爲了讓'Disposed'狀態更加獨特 - 當所有伴隨對象拋出時拋出'ObjectDisposedExcpt',OTOH'NullReferenceExcpt'保證。但那取決於..有時候nullreference是誤導 – quetzalcoatl

回答

0

該代碼是安全的,因爲它不能拋出空引用異常。它不是100%等價的,因爲在處理後你仍然需要將引用設置爲null。這可能並不重要,但在某些情況下,如果包含對象在處理後停留在範圍內,它可以幫助垃圾收集器。

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

你的意思是'ref IDisposable memeber'? – quetzalcoatl

+0

接口是引用類型,那真的有必要嗎?無論哪種方式,考慮它我可能不會創建這樣的方法,除非有大量的成員需要處置。 – kai

+1

您的評論後,我會-1它..但是,然後,這裏是我的地方上午2:00,所以也許在你的時區你已經太累了..「參考類型」/「值類型「(類/結構)和」通過ref傳遞「/」通過值傳遞「(ref/no ref)在參數列表中。你有沒有嘗試給方法的參數賦值新的值?如果沒有,請嘗試,並且觀察被調用者的值**在添加'ref'之前不會改變**。 – quetzalcoatl