usingステートメント(C#の)中で、様々なタイプを使用して

StackOverflow https://stackoverflow.com/questions/966086

  •  12-09-2019
  •  | 
  •  

質問

ステートメントを使用してC#はトライ/のためだけ糖衣構文であるので最終的には、なぜ彼らは、同じタイプのある場合にのみ、複数のオブジェクトを受け入れるん{}処分?

彼らがする必要があるすべてはIDisposableをであるため、

私はそれを得ることはありません。それらのすべてがIDisposableインターを実装する場合、それは問題ないはずですが、そうではありません。

具体的にI午前の書き込みに使用されます。

using (var cmd = new SqlCommand())
{
    using (cmd.Connection)
    {
        // code
    }
}

私はに圧縮されます:

using (var cmd = new SqlCommand())
using (cmd.Connection)
{
    // code
}

と私はにさらに圧縮したいと思います:

using(var cmd = new SqlCommand(), var con = cmd.Connection)
{
    // code
}

私はできません。私はおそらく、いくつかのように書く、言うことができます:

using((var cmd = new SqlCommand()).Connection)
{
    // code
}

私は処分する必要があるすべては、接続していないコマンドですが、それはポイント以外だから。

役に立ちましたか?

解決

あなたはこのかかわらを行うことができます:

using (IDisposable cmd = new SqlCommand(), con = (cmd as SqlCommand).Connection)
{
   var command = (cmd as SqlCommand);
   var connection = (con as SqlConnection);
   //code
}

おそらく、それはあなたに満足のいくだろう。

他のヒント

何も特に優れた技術的な理由はありません。我々は、不均一なタイプの複数の宣言を許可構文が出ている可能性があります。我々はなかった、とすでにさまざまな種類のブロックを使用してネストされた宣言するために完全に、良い明確な、理解しやすいとかなり簡潔なメカニズムがあり、我々はわずか数キーストロークを節約するために、新たな糖衣構文を追加しそうだということを考える。

C#で他の変数宣言は、あなたが同じ文で、同じタイプの複数の変数を宣言することができます。 usingヘッダが異なっている必要がありますなぜ私は表示されません。

法案に合うかもしれない、これを使用しての

私の個人的な方法:

private const string SQL_CONNECTION = "Your Connection String Here";

private void Test(string sqlCmd)
{
  using (var cmd = new SqlCommand(sqlCmd, new SqlConnection(SQL_CONNECTION)))
  {
    cmd.Connection.Open();
    cmd.ExecuteNonQuery();
    cmd.Connection.Close();
    // Close() is not really necessary.
    // Dispose will Close the connection.
  }
}

いいえ、これは1行でusing句の2つのインスタンスではありませんが、あなたがあなたの例で取得しようとしているほどコンパクトです。

多くはである何、あなたはこれがさらにコンパクトに作ることができますし、私有財産への接続文字列を回して優しいプログラマます:

private SqlConnection OpenConnection
{
  get {
    var con = new SqlConnection(SQL_CONNECTION);
    con.Open();
    return con;
  }
}

次に、上記Test()のコードの最初のビットは、以下に短縮することができること

private void Test2(string sqlCmd)
{
  using (var cmd = new SqlCommand(sqlCmd, OpenConnection))
  {
    cmd.ExecuteNonQuery();
  }
}

これは非常にいいコーディングになります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top