Что Управляемый С++ эквивалентен оператору использования C#

Просто скопируйте файл .jar в папку libs, щелкните его правой кнопкой мыши и выберите «Добавить как библиотеку» в списке. Он сделает все остальное ...

21
задан mwigdahl 24 March 2009 в 18:17
поделиться

4 ответа

Принятие Вас означает C++ / CLI (не старый Управляемый С++), следующее Ваши опции:

(1) Имитатор блок использования с использованием автоматического / стековые объекты:

{
  SqlConnection conn(connectionString);
}

Это назовет Деструктор "вести" Объекта когда следующие концы блока включения. Является ли это функцией включения, или блок, который Вы вручную добавляете к предельному объему, не имеет значения.

(2) Явно вызов "Располагает", т.е. разрушает объект:

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

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

первый был бы прямой заменой для "использования". Второй является опцией, обычно Вы не должны будете делать, если Вы дополнительно не передадите ссылку на где-то в другом месте.

32
ответ дан 29 November 2019 в 20:59
поделиться

Для этого в Managed C ++ просто используйте семантику стека.

void Foo(){
   SqlConnection con("connectionStringGoesHere");
    //do stuff
}

Когда con выходит из области видимости, вызывается «Destructor», т.е. Dispose ().

3
ответ дан 29 November 2019 в 20:59
поделиться

Вы могли сделать что-то подобный в стиле 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;
};
2
ответ дан 29 November 2019 в 20:59
поделиться

Если Вы обеспокоены ограничением пожизненного, а не автоматического распоряжения переменной, можно всегда просто помещать его в его собственный объем:

void Foo()
{
    {
        SqlConnection con = new SqlConnection("connectionStringGoesHere");
        // do stuff
        // delete it before end of scope of course!
    }
}
-2
ответ дан 29 November 2019 в 20:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: