3

好奇心から、mscorlib.dll を逆アセンブルして、System.Object クラスの実装を確認しました。

その中で奇妙なものを見つけました。

1).    
public class Object {
...
    protected override void Finalize(){}
...
}

基本クラスにオーバーライドされたメソッドがあるのはなぜですか?

2) public class Employee {
            public void InstanceMethod() {
                this.Finalize();
                //Does not compile, can i not access protected methods of base class??
            }
        }

Object クラスでの「保護された Finalize」メソッドの使用と、コンパイラによる特別な処理が必要な理由を知りたいのですが。

4

3 に答える 3

4

これは Reflector のバグです。仮想であるが "newslot" 属性を持たず、基本クラス型を持たないメソッドによって混乱します。逆コンパイラをILに切り替えると見やすいかもしれません。

Reference Source からコピーされたファイナライザーの実際の宣言は、期待どおりです。

// Allow an object to free resources before the object is reclaimed by the GC.
//
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
~Object()
{
}
于 2010-01-23T12:34:13.360 に答える
1

2 番目の質問では、C#~MyClassは VB.NET で記述されており、Protected Overrides Sub Finalize()これは と同等protected override Finalize()です。つまり、C# の構文の違いだけです。

最初の質問については、Reflector では

.method family hidebysig virtual instance void Finalize() cil managed

newslotこれは、上書きされたものと比較して、新しい仮想メンバーで一般的に見られる属性が欠落しています。

于 2010-01-23T12:35:53.233 に答える
0

Object.Finalizeの MSDN を確認してください。

デストラクタは、クリーンアップ操作を実行するための C# メカニズムです。デストラクタは、基本型のデストラクタを自動的に呼び出すなど、適切なセーフガードを提供します。C# コードでは、Object.Finalize を呼び出したりオーバーライドしたりすることはできません。

したがって、あなたの質問に対する答えは次のようになります。まあ、それは CLR の内部の一部です。C# コンパイラは、たとえば次のように記述するときに必要なすべての作業を行います。

public class Employee
{
   //Finalizer, also known as "destructor"
   ~Employee()
   {

   }
}
于 2010-01-23T12:13:40.130 に答える