2013-12-08 19 views
0

考慮下面的類:做一些當一個對象被設置

public class SomeObject 
{ 
     public string x { get; set; } 
     public int y { get; set; } 

     private void Serialize(){} 
     //When the object gets collected by the GC want to call the Serialize() function 
} 

我應該使用什麼事件用於這一目的?

我想調用函數時,GC收集的對象或應用程序關閉時,但我想從類

+0

你是什麼意思的「處置」?你不是在說'IDisposable',對吧?將[Object.Finalize](http://msdn.microsoft.com/en-us/library/system.object.finalize(v = vs.110).aspx)工作? – dasblinkenlight

+0

@dasblinkenlight我需要的是在應用程序關閉或GC收集該對象時調用該方法 – FPGA

+0

您可以詳細說明您正在嘗試執行的操作嗎?雖然終結者似乎是正確的地方,但這似乎是一個非常糟糕的主意(考慮到與之相關的各種不確定因素,以及在使用終結器時嚴重破壞應用程序的不同方式)。 –

回答

4

如果確實需要在收集對象時做某些事情,那麼您將使用Finalize method

正常情況下,終結器方法僅用作備份,用於何時不正確地處理對象,以嘗試清除大部分混亂。

不能保證Finalizer方法實際上是爲所有對象執行的,所以它不是清理對象的可靠方法。當應用程序結束時,垃圾收集器花費一些時間來收集對象併爲那些實現它的人運行Finalize methots,但是如果該過程花費太長時間,它將放棄剩下的對象並關閉應用程序。

對象需要做的事情,當它不再使用,應該實現IDisposable interface。但是請注意,這並不意味着對象會自動執行任何操作,而是程序員使用該對象正確處理它的責任。

+0

多久太久了? – FPGA

+0

對於最後一段,這是唯一需要採取的行動。 – Rotem

+1

@ user1492051:這是垃圾收集器中的一個實現細節,我不記得看到一個確切的數字,但它會像幾秒鐘。 – Guffa

2

內做到這一點你能不能調用析構函數Serialize()方法:

public class SomeObject 
{ 
    public string x { get; set; } 
    public int y { get; set; } 

    private void Serialize(){} 

    ~SomeObject() { 
     Serialize(); 
    } 

} 
+3

終結器不保證運行。 –

+0

,以便在應用程序關閉時以及GC收集該對象時調用? – FPGA

+0

當對象已經處理好時,大多數一次性對象使用GC.SuppressFinalizer方法。因此,終結器將不會被調用。 –

0

公共覆蓋OnDispose。但是你的班級必須爲此實施IDisposable。

相關問題