Как можно закодировать следующий код C# в Managed C++
void Foo()
{
using (SqlConnection con = new SqlConnection("connectionStringGoesHere"))
{
//do stuff
}
}
Пояснение: для управляемых объектов.
Как можно закодировать следующий код C# в Managed C++
void Foo()
{
using (SqlConnection con = new SqlConnection("connectionStringGoesHere"))
{
//do stuff
}
}
Пояснение: для управляемых объектов.
Предполагая, что вы имеете в виду C++/CLI (а не старый Managed C++), у вас есть следующие варианты:
(1) Имитация использования блока с использованием автоматических/стековых объектов:
{
SqlConnection conn(connectionString);
}
Это вызовет деструктор объекта "conn", когда закончится следующий объемлющий блок. Не имеет значения, является ли это закрывающей функцией или блоком, который вы вручную добавляете для ограничения области действия.
(2) Явно вызовите «Dispose», т.е. уничтожьте объект:
SqlConnection^ conn = nullptr;
try
{
conn = gcnew SqlConnection(conntectionString);
}
finally
{
if (conn != nullptr)
delete conn;
}
Первый будет прямой заменой «использования». Второй - это вариант, обычно вам не нужно делать это, если вы не передадите ссылку куда-то еще.
Dispose
. Поэтому, если у вас есть тип, который правильно реализует IDisposable
, все должно быть в порядке. т.е. время фактического GC, которое не имеет ничего общего с Dispose
как таковым, не имеет значения, потому что фактическая очистка происходит (детерминированная) в той точке кода, которую вы ожидаете (var выходит за рамки).
- person Christian.K; 18.11.2011
Для этого в Managed C++ просто используйте семантику стека.
void Foo(){
SqlConnection con("connectionStringGoesHere");
//do stuff
}
Когда con выходит за пределы области действия, вызывается "Destructor", т.е. Dispose().
Вы можете сделать нечто похожее в стиле auto_ptr:
void foo()
{
using( Foo, p, gcnew Foo() )
{
p->x = 100;
}
}
со следующим:
template <typename T>
public ref class using_auto_ptr
{
public:
using_auto_ptr(T ^p) : m_p(p),m_use(1) {}
~using_auto_ptr() { delete m_p; }
T^ operator -> () { return m_p; }
int m_use;
private:
T ^ m_p;
};
#define using(CLASS,VAR,ALLOC) \
for ( using_auto_ptr<CLASS> VAR(ALLOC); VAR.m_use; --VAR.m_use)
Для справки:
public ref class Foo
{
public:
Foo() : x(0) {}
~Foo()
{
}
int x;
};
Если вы беспокоитесь об ограничении времени жизни переменной, а не об автоматическом удалении, вы всегда можете просто поместить ее в свою область видимости:
void Foo()
{
{
SqlConnection con = new SqlConnection("connectionStringGoesHere");
// do stuff
// delete it before end of scope of course!
}
}