簡體   English   中英

在C#中引用已處置的對象

[英]Referencing disposed objects in C#

如果這是一個愚蠢的問題,很抱歉,但是在您明確處置了一個對象之后,您不應再引用該對象...對嗎?

例子:這通常是個壞主意吧?

SomeObject o = new SomeObject();

o.DoStuff();

o.Dispose();

o.DoMoreStuff();

另外,是否有必要做類似這樣的事情?

除非需要,否則您永遠不會丟棄它。 處理對象意味着您不再需要該對象。 並且當您不再需要該對象時,您將對其進行處置(如果它是一次性的)。 因此,在對象被處置后再也沒有訪問權限。

處置對象會使其釋放所有不受管理的資源,因此您必須問自己的問題是“如果沒有這些資源,該對象能否做任何有意義的事情”。 那將取決於對象的細節。

大多數IDisposable對象的設計方式是,如果您在處理實例后嘗試調用其方法,則它們將引發異常,或更糟的是,將發生意外行為。

即使被丟棄,其他對象仍有可能要做有意義的事情。 例如,DataTable實現IDisposable,但是有意義的數據傾向於存儲在托管資源中,而不是非托管資源中。 在當前的實現中(可能會更改),其Dispose方法不執行任何操作,因此在處理后使用它就可以了。 (話雖如此,當您仍然打算使用它時,並沒有令人信服的理由對其進行處置。)

還可以想象一個對象在處理完之后重新創建它需要的任何資源(這是一個壞主意,但仍然可能 )。

綜上所述,將對象設計為即使要處理后也要專門使用,這是一種不好的做法,這也是Disposable對象的意圖,直到完成后才對其進行處理。用它。 這里的要點是,即使您不應該這樣做,它也會經常在您的面前誇大其詞,這是因為這是選擇實現該類(符合慣例)的方式,而不是因為它是技術性的需求。

盡管從理論上講,絕對沒有什么可以阻止您創建允許您處置然后繼續使用該對象的類,但我無法想到一個理想的情況(除了檢查該對象是否具有被處置,例如IsDisposed )。

通常,所使用的模式是簡單地丟棄已處置的對象,並在必要時重新創建它們,實際上,在許多情況下,嘗試訪問已處置的對象將導致拋出ObjectDisposedException 如果要創建實現IDisposable的對象,那么遵循此約定將是一個好主意。

為了幫助跟蹤已處置和未處置的對象(即使在拋出異常的情況下也可確保處置您的對象),請使用using語句:

using (SomeObject o = new SomeObject())
{
    o.DoStuff();
}

我喜歡在實現IDisposable時使用這種模式。

private bool m_disposed;

public void Dispose()
{
    Dispose(true);
    GC.SuppressFinalize(this);
}

public void Dispose(bool disposing)
{
    if (!m_disposed)
    {
        if (disposing)
            // Cleanup and close resources

        m_disposed = true;
    }
}

然后在類中的所有其他方法中,我將執行此操作...

public void DoMoreStuff()
{
    if (m_disposed)
        throw new ObjectDisposedException();

  // Your code here
}

public void DoStuff()
{
    if (m_disposed)
        throw new ObjectDisposedException();

    // Your code here
 }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM