2011-05-18 141 views
1

我一直在負責經歷了一些舊的代碼在工作中清理,我碰到一個偶然類:有關繼承IDisposable的詳細信息?

public class XMLLayer : Object, IDisposable 

首先,我發現明確的對象繼承是不必要的,但後來我發現,處置方法是相當無用:

public void Dispose() 
{ 
    Dispose(); 
} 

無處處於using塊的XMLLayer的實例中,具有它的Dispose()顯式調用,或者被放置在IDisposable變量(多態性)。

我錯在假設Dispose方法的思路是增加自己的自定義清理代碼的類?

+0

你是說了'Dispose'方法調用本身? – Gabe 2011-05-18 18:30:00

+3

Woa,調用Dispose可能會導致堆棧溢出... – 2011-05-18 18:30:16

+4

我認爲最初的開發人員認爲'Dispose'意思是「處理過程」。你知道,如同它,把它發送到二進制地獄。 – BoltClock 2011-05-18 18:31:46

回答

2

要回答你的問題:

我錯在假設Dispose方法的想法 是爲您的課程添加您自己的自定義清理代碼 ?

請參見以下問題及其接受的答案:

Proper use of the IDisposable interface

1

這種方法不僅是無用的 - 它會導致StackOverflowException和終止應用程序,如果它曾經被稱爲(或只是掛線程永遠,如果JIT取得了使用尾遞歸)。

XMLLayer看起來真的有什麼需要要配置嗎?當C#是新的,有些人決定始終實施IDisposable「以防萬一」。幸運的是,據我所知,這些日子並沒有發生。

您應該實現IDisposable如果它是直接或間接持有的非託管資源 - 例如如果有一個類型爲Stream的字段。

+0

不對我。有十幾個字符串,另一個類(LayerInfo)具有相同的IDisposable問題(包括EXACT相同的循環遞歸處理函數)和一個列表。 – 2011-05-18 18:36:21

+0

@Corey:聽起來像現在是刪除Dispose方法和整個':Object,IDisposable' :)的時候 – 2011-05-18 18:39:01

0

不,你是對的。如果Dispose()法曾經被調用,它只是稱自己永遠反覆無論如何,這是它從來沒有被使用一個非常好的跡象。

1

這處置doen't似乎這麼多無用的,因爲它是危險的。它會自動調用自己,直到最終以殺死應用程序爲止StackOverflowException

您正確地認爲Dispose用於清理。但主要是清理非託管資源。這些都是資源是.NET甚至無法知道其存在,因此不會清除任何