什么是与C#using语句等效的托管C++

Ada*_*gen 21 .net managed-c++ using-statement

如何在Managed C++中编写以下C#代码

void Foo()
{
    using (SqlConnection con = new SqlConnection("connectionStringGoesHere"))
    {
         //do stuff
    }
}
Run Code Online (Sandbox Code Playgroud)

Clarificaton: 对于托管对象.

Chr*_*n.K 32

假设您的意思是C++/CLI(不是旧的托管C++),您可以选择以下选项:

(1)使用自动/基于堆栈的对象模仿使用块:

{
  SqlConnection conn(connectionString);
}
Run Code Online (Sandbox Code Playgroud)

当下一个封闭块结束时,这将调用"conn"对象的析构函数.无论这是封闭功能,还是手动添加以限制范围的块都无关紧要.

(2)明确调用"Dispose",即破坏对象:

SqlConnection^ conn = nullptr;
try
{
  conn = gcnew SqlConnection(conntectionString);

}
finally
{
  if (conn != nullptr)
    delete conn;
}
Run Code Online (Sandbox Code Playgroud)

第一个是"使用"的直接替代品.第二个是一个选项,除非您选择将引用传递给其他地方,否则通常您不需要这样做.

  • 需要注意的一点是,当var超出范围时,它会为GC排队*,但实际的GC可能会"稍后"发生.因此,如果在丢失范围之前进行清理很重要,那么您需要明确地执行此操作,而不是等待析构函数/终结符.我最近有一个例子,我正在写一个文件流,而不是显式调用stream.Close().我发现流没有完全刷新,直到"稍晚一些"(即当GC运行时),这导致了问题.解决方案是在流超出范围之前添加对stream.Close()的显式调用. (3认同)
  • @dlchambers我在这里没有实际经验,但AFAIK [析构函数是确定性的](http://www.codeproject.com/KB/mcpp/cppclidtors.aspx)在C++/CLI中.即在调用析构函数时,它实际上是`Dispose`被调用.因此,如果你有一个"正确"实现`IDisposable`的类型你应该没问题.即实际GC的时间,与"Dispose"无关,这无关紧要,因为实际的清理在您期望的代码中发生(确定性)("var超出范围"). (3认同)