C#言語仕様3.0のセクション10.13、デストラクタは次のように述べています。
デストラクタは継承されません。したがって、クラスには、そのクラスで宣言できるデストラクタ以外のデストラクタはありません。
C#プログラミングガイドのデストラクタセクションには、継承階層内のデストラクタがどのように呼び出されるかを示す例が含まれています。これには、次のステートメントが含まれます。
...クラスのデストラクタは自動的に呼び出され、最も派生したものから最も派生しなかったものへと順番に呼び出されます。
デストラクタを定義する基本クラス、基本クラスから継承し、デストラクタを定義しない派生クラスなど、さまざまな実用的な例でこれを調査しました。派生クラスのインスタンスを作成し、インスタンスへのすべての参照をスコープ外に出してからガベージコレクションを強制すると、派生クラスのインスタンスがファイナライズされたときに基本クラスで定義されたデストラクタが呼び出されることがわかります。
私の質問は、「デストラクタは継承されない」とは実際にはどういう意味ですか。デストラクタを明示的に呼び出すことはできませんが、継承チェーン内のデストラクタは自動的に呼び出され、派生クラスがデストラクタを定義していなくても基本クラスのデストラクタが呼び出されます。 ?
ファイナライズがC#言語/コンパイラではなくガベージコレクタによって実装されるという、いくつかの微妙な意味上の違いに関連していますか?
編集1:
C#言語仕様では、「インスタンスコンストラクターは継承されない」と規定されていますが、コンストラクターに関連する動作は記述子とは大幅に異なり、以下の例に示すように、「継承されない」用語でIMOに適合します。
public class ConstructorTestBase
{
public ConstructorTestBase(string exampleParam)
{
}
}
public class ConstructorTest: ConstructorTestBase
{
public ConstructorTest(int testParam)
: base(string.Empty)
{
}
}
...
// The following is valid since there is a derived class constructor defined that
// accepts an integer parmameter.
ConstructorTest test1 = new ConstructorTest(5);
// The following is not valid since the base class constructor is not inherited
// by the derived class and the derived class does not define a constructor that
// takes a string parameter.
ConstructorTest test2 = new ConstructorTest("Test");
次の例に示すように、デストラクタに関連する動作はこれとは大きく異なります。次の例では、基本クラスにのみ記述子を追加することで、前のコンストラクタの例を拡張しています。
public class ConstructorTestBase
{
public ConstructorTestBase(string exampleParam)
{
}
~ConstructorTestBase()
{
Console.WriteLine("~ConstructorTestBase()");
}
}
...
ConstructorTest test1 = new ConstructorTest(5);
test1 = null;
GC.Collect();
上記の例は、派生クラスがデストラクタを明示的に定義していなくても、派生クラスのインスタンスがファイナライズされたときに基本クラスコンストラクタが呼び出されることを示しています。
私の言いたいことは、これが何が起こっているのかを理解または理解していない多くの人々に出会ったということです。この理由の重要な部分は、「デストラクタは継承されない」というステートメントです。
編集2:
C#言語仕様には、次のことも記載されており、内部実装のコード例が示されています。
デストラクタは、System.Objectの仮想メソッドFinalizeをオーバーライドすることによって実装されます。C#プログラムでは、このメソッドをオーバーライドしたり、直接呼び出したり(またはオーバーライドしたり)することはできません。
ボンネット内の実装は、実際には、前述のように継承に基づいているため、私の質問は有効であり、これまでに受け取った応答のいずれも、質問に適切に対処していないと思います-何「デストラクタは継承されない」とは、実際にはどういう意味ですか?