Um Michael Damatovs Antwort (C#) zu portieren, die auf Herfried K. Wagner basiert. (VB.NET) ist hier die C++/CLI-Version:
ref class MyClass
{
ref class StaticFinalizer sealed
{
!StaticFinalizer();
};
static initonly StaticFinalizer^ stDestr = gcnew StaticFinalizer();
}
MyClass::StaticFinalizer::!StaticFinalizer()
{
System::Diagnostics::Debug::WriteLine("In StaticFinalizer!");
}
P.S. Genau wie die AppDomain.ProcessExit-Methode wird diese möglicherweise nicht aufgerufen, wenn der Prozess abnormal beendet wird (z. B. vom Task-Manager). Ein anderes Wort der Warnung ist, dass, wenn MyClass generisch ist (templated), die Annahme, dass sein statischer Konstruktor und der statische Destruktor nicht mehr als einmal pro Anwendungsausführung aufgerufen werden, nicht länger gültig ist.
Zunächst müssen wir in C# aus der Gewohnheit herauskommen, Finalizer und Destruktor austauschbar zu verwenden. Das eine ist deterministisch, das andere nicht. Es ist interessant festzustellen, dass die C# -Spezifikation die Ausdrücke aus der CLR und anderen .NET-Sprachspezifikationen zurückerhält.Es ist auch interessant zu bemerken, dass die Anmerkungen des C# Sprachkomitees ausdrücklich sagen, dass es keine vorhersehbaren Gründe gibt, warum C# keine statischen Finalizer haben kann. http://StackOverflow.com/a/1875149/56793 – JMD