下面的函數給出編譯錯誤「不要覆蓋object.Finalize,而應該提供析構函數。」在C#中如何重載Finalize()方法?
protected override void Finalize()
{
this.Dispose();
base.Finalize();
}
下面的函數給出編譯錯誤「不要覆蓋object.Finalize,而應該提供析構函數。」在C#中如何重載Finalize()方法?
protected override void Finalize()
{
this.Dispose();
base.Finalize();
}
終結器方法被稱爲~name()
用您的類名替換「名稱」。
C#編譯器將從此生成終結器。
但請注意:
SafeHandle
,而不是寫自己的。例如
class MyClass : IDisposable {
private IntPtr SomeNativeResource;
~MyClass() {
Dispose(false);
}
public void Dispose() {
Dispose(true);
}
protected virtual void Dispose(bool disposing) {
if (disposing) {
// Dispose any disposable fields here
GC.SuppressFinalize(this);
}
ReleaseNativeResource();
}
}
子類可以覆蓋Dispose(bool)
添加它們添加任何另外的字段並調用基實現。
編輯:添加示例和筆記關於何時完成。
你沒有。
收聽編譯器。你不應該重寫Finalize。相反,您應該實施IDisposible並重寫Dispose。
除非您明確需要釋放由對象直接保存的資源,否則您應該可以在Dispose方法中完成所需的任何操作。
但是如果你必須:
public class MyClass
{
public MyClass() { ... } // Constructor
public ~MyClass() { ... } // Destructor/Finalizer
}
只是要小心,因爲終結是棘手的,如果實施不當可隨身攜帶一些相當沉重的性能開銷。
聽聽編譯器錯誤,他們明智超越他們的歲月(除非你真的需要,在極少數情況下,實際上弄亂了終結者......命名在C#中有點倒退)。
而應該落實Dispose()
,使你的類實現IDisposable
,像這樣:
public class MyClass : IDisposable
{
public void Dispose()
{
//cleanup
}
}
然後使用你的類時,它包裝在一個using
,像這樣:
using(var mc = new MyClass()) {
//use it for things
} //it gets disposed here
然後使用你的類時,其包裝在使用,如: 使用(VAR MC =新MyClass的()){// 用它來做事情 } //它被安置在這裏 請詳細說明。 ... as i havnt us「using」... – 2010-05-26 13:33:37
@Ramakant - 當你想要像處理文件句柄一樣處理一個對象時使用''using()'',例如:'using(var r = File.OpenText(「myFile.log」)){//對讀者做些什麼..},在該語句結束時,文件句柄儘快關閉,釋放鎖和資源。 – 2010-05-26 13:44:03
你錯過**無效**? – 2016-03-10 03:17:57
@雷洋:是:兩次。幾乎6年後(!),現在已經修復。 – Richard 2016-03-10 09:01:26