我认为,有一种更简单的方法可以对托管对象进行确定性处理。只需在没有 a 的情况下声明它们^
,您将获得与*
不使用非托管 C++ 类相同类型的行为:初始化变量时调用构造函数,而“析构函数”(实际上是 Dispose 方法)当变量超出范围时调用。
当它被编译时,如果它是一个局部变量,它会变成一个 try-catch-dispose,或者如果它是一个类字段,它会在该类的 Dispose 方法中添加一行。
这与 auto_handle 没有太大区别,auto_handle 在其析构函数中调用了 Dispose,但我认为语法更易于使用。
例子:
C++/CLI:
public ref class Foo
{
AutoResetEvent are;
public:
Foo() : are(false)
{
this->are.Set(); // Use a '.' to access members.
}
void SomeMethod()
{
AutoResetEvent are2(false);
are2.Set();
}
};
等效的 C#,来自 Reflector,所以你可以看到它在幕后做了什么:
public class Foo : IDisposable
{
// Fields
private readonly AutoResetEvent modreq(IsByValue) are;
// Methods
public Foo()
{
AutoResetEvent modopt(IsConst) event2 = new AutoResetEvent(false);
try
{
this.are = event2;
base..ctor();
this.are.Set();
}
fault
{
this.are.Dispose();
}
}
public void ~Foo()
{
}
public sealed override void Dispose()
{
this.Dispose(true);
GC.SuppressFinalize(this);
}
[HandleProcessCorruptedStateExceptions]
protected virtual void Dispose([MarshalAs(UnmanagedType.U1)] bool flag1)
{
if (flag1)
{
try
{
this.~Foo();
}
finally
{
this.are.Dispose();
}
}
else
{
base.Finalize();
}
}
public void SomeMethod()
{
AutoResetEvent are2 = null;
AutoResetEvent modopt(IsConst) event2 = new AutoResetEvent(false);
try
{
are2 = event2;
are2.Set();
}
fault
{
are2.Dispose();
}
are2.Dispose();
}
}