当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《什么是与C#using语句等效的托管C++》经验,为你挑选了1个好方法。

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

void Foo()
{
    using (SqlConnection con = new SqlConnection("connectionStringGoesHere"))
    {
         //do stuff
    }
}

Clarificaton: 对于托管对象.



1> Christian.K..:

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

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

{
  SqlConnection conn(connectionString);
}

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

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

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

}
finally
{
  if (conn != nullptr)
    delete conn;
}

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


需要注意的一点是,当var超出范围时,它会为GC排队*,但实际的GC可能会"稍后"发生.因此,如果在丢失范围之前进行清理很重要,那么您需要明确地执行此操作,而不是等待析构函数/终结符.我最近有一个例子,我正在写一个文件流,而不是显式调用stream.Close().我发现流没有完全刷新,直到"稍晚一些"(即当GC运行时),这导致了问题.解决方案是在流超出范围之前添加对stream.Close()的显式调用.
@dlchambers我在这里没有实际经验,但AFAIK [析构函数是确定性的](http://www.codeproject.com/KB/mcpp/cppclidtors.aspx)在C++/CLI中.即在调用析构函数时,它实际上是`Dispose`被调用.因此,如果你有一个"正确"实现`IDisposable`的类型你应该没问题.即实际GC的时间,与"Dispose"无关,这无关紧要,因为实际的清理在您期望的代码中发生(确定性)("var超出范围").
推荐阅读
手机用户2502852037
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有