正如您所指出的,在 C++/CLI 中,我们实现了 ~ClassName 和 !ClassName,C++/CLI 编译器为我们编写了 Dispose(void) 和 Dispose(bool)。
我尝试从 HashAlgorithm 派生,并且能够使 dispose 和 finalize 都能正常工作。声明某些方法的方式可能存在细微差别。
这是我的测试代码:
public ref class CppDispose : HashAlgorithm
{
private:
~CppDispose() { Debug::WriteLine("~CppDispose"); }
!CppDispose() { Debug::WriteLine("!CppDispose"); }
protected:
virtual void HashCore(array<Byte>^ aray, int ibStart, int cbSize) override { }
virtual array<Byte>^ HashFinal() override { return nullptr; }
public:
virtual void Initialize() override { }
};
int main(array<System::String ^> ^args)
{
{
CppDispose foo;
Debug::WriteLine("Disposing: ");
}
{
CppDispose^ foo = gcnew CppDispose();
Debug::WriteLine("Finalizing: ");
foo = nullptr;
GC::Collect();
}
return 0;
}
输出:
处置:
~CppDispose
最终确定:
!CppDispose
为了让您可以看到幕后发生的事情,这里是 C++/CLI 编译器为我们编写的方法,反编译为 C# 语法。在这种情况下,父类已经实现了 Dispose(void),所以这里不再重新实现。
[HandleProcessCorruptedStateExceptions]
protected override void Dispose([MarshalAs(UnmanagedType.U1)] bool flag1)
{
if (flag1)
{
try
{
this.~CppDispose();
}
finally
{
base.Dispose(true);
}
}
else
{
try
{
this.!CppDispose();
}
finally
{
base.Dispose(false);
}
}
}
protected override void Finalize()
{
this.Dispose(false);
}