23

マネージ C++ で次の C# コードをどのようにコーディングしますか?

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

明確化: 管理対象オブジェクト用。

4

5 に答える 5

33

C ++ / CLI(古いマネージC ++ではない)を意味すると仮定すると、次のオプションがあります。

(1)自動/スタックベースのオブジェクトを使用してusing-Blockを模倣します。

{
  SqlConnection conn(connectionString);
}

これにより、次の囲んでいるブロックが終了したときに、「conn」オブジェクトのデストラクタが呼び出されます。これが囲み関数であるか、スコープを制限するために手動で追加するブロックであるかは関係ありません。

(2)明示的に「Dispose」を呼び出します。つまり、オブジェクトを破棄します。

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

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

1つ目は、「使用」の直接の代替です。2つ目はオプションです。通常、オプションで参照を別の場所に渡さない限り、実行する必要はありません。

于 2008-12-04T07:47:12.433 に答える
3

Managed C++ でこれを行うには、スタック セマンティクスを使用するだけです。

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

con がスコープ外になると、「デストラクタ」、つまり Dispose() が呼び出されます。

于 2008-12-04T02:21:53.463 に答える
2

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;
};
于 2009-03-23T13:21:28.467 に答える
-3

自動破棄ではなく変数の有効期間を制限することに関心がある場合は、いつでも変数を独自のスコープに入れることができます。

void Foo()
{
    {
        SqlConnection con = new SqlConnection("connectionStringGoesHere");
        // do stuff
        // delete it before end of scope of course!
    }
}
于 2008-12-03T23:17:06.753 に答える