【发布时间】:2013-05-07 09:14:20
【问题描述】:
我有一个 C# 对象,它可用于如下所示的资源:
public sealed class CLoadingScope
{
private bool isDisposed;
public CLoadingScope()
{}
~CLoadingScope()
{
// must be disposed otherwise it is used incorrectly
if (!isDisposed)
{
throw new ApplicationException("RAII object has not been disposed");
}
}
public void Dispose()
{
// CLEANUP CODE HERE […]
isDisposed = true;
GC.SuppressFinalize(this);
}
};
我在一些 C++/CLI 代码中使用它,如下所示:
{
CLoadingScope scope;
// CODE THAT USES THE RESSOURCE HERE […]
}
但这会导致抛出异常。 我期待这能起作用,因为 Dispose 是 C# 类的析构函数,堆栈对象在其作用域结束时被销毁。至少我是这样解释answer to this question 的。 由于 C#、C++ 和 C++/CLI 中终结器和析构函数的所有命名和使用混淆,我假设我混淆了一些东西。谁能告诉我什么? :)
【问题讨论】:
-
实现 IDisposable 接口 + 使用 using(var a = new CLoadingScope()) 将调用析构函数...
-
@Sergejs 我认为在 C++/CLI 中不允许使用指令。
-
嗯,对不起。这就是它在 C# 中的工作方式。那么,我相信你必须手动调用析构函数。
-
要更深入地了解何时调用 dispose,请阅读此 SO 帖子 stackoverflow.com/questions/2871888/dispose-when-is-it-called,对于您可能更明确的答案,请阅读此 SO 帖子 stackoverflow.com/questions/1987251/…
-
此外,当一个对象被释放时,它只会排队等待 GC,这将在“稍后”发生
标签: c# c++-cli destructor raii finalizer