2016-07-21 9 views
3

Joseph AlbahariとBen Albahari(O'Reilly)のまとめでC#6.0。オブジェクト型に保護された仮想Finalizeメソッドが含まれていますか?

Copyright 2016 Joseph AlbahariとBen Albahari、978-1-491-92706-9。ページ100-101で

状態は、オブジェクトクラスのメンバーがあること:

public class Object 
{ 
    public Object(); 
    public extern Type GetType(); 
    public virtual bool Equals (object obj); 
    public static bool Equals (object objA, object objB); 
    public static bool ReferenceEquals (object objA, object objB); 
    public virtual int GetHashCode(); 
    public virtual string ToString(); 
    protected virtual void Finalize(); //<-- this one 
    protected extern object MemberwiseClone(); 
} 
VS's intellisenseは私にすべての参照インスタンスの Finalize()方法を与える場合、私はしないので、見に行くために私を促した

1つを見て覚えている。

Finalizeメンバーが継承されたオブジェクトを取得するのに成功しません(私は、それが保護されているという事実を認識して、関数内でアクセスしようとしています)。

.NET's open source codeをチェックし、object.csファイルにはFinalizeメソッドが含まれていません。

私には何が欠けていますか?これは作者の間違いですか?

答えて

4

MSDNから:C#コンパイラを使用すると、Finalizeメソッドをオーバーライドすることはできません

。 代わりに、 クラスのデストラクタを実装してファイナライザを提供します。 C#デストラクタは、基底クラス のデストラクタを自動的に呼び出します。

を実装するには、~ClassName()を使用する必要があります。

Object.csC#と書かれていますので、Finalize()の代わりに~Object()となります。

は、私はあなたがこのarticleEric Lippertから、このanswer

を読むことをお勧め:

この機能は、紛らわしいエラーが発生しやすい、と広く誤解です。それは の構文がC++のユーザーには非常によく知られていますが、意外にも異なる意味は です。ほとんどの場合、この機能の使用は危険で、 は不要で、バグの症状になります。
場合によっては、 がインフラを構築している専門家向けの機能を実装する必要があります。これらの機能には、他の言語の機能と似ているわけではなく、危険な点として明確に というマークを付ける必要があります。

関連する問題