29

C#ステートメントは try/finally{dispose} の単なる構文糖衣であるため、同じ型の場合にのみusing複数のオブジェクトを受け入れるのはなぜですか?

必要なのはIDisposableだけなので、わかりません。それらのすべてが IDisposable を実装していれば問題ないはずですが、そうではありません。

具体的には、私は書くことに慣れています

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
}

私が処分する必要があるのはコマンドではなく接続だけなので、それは重要ではありません。

4

4 に答える 4

21

ただし、これを行うことができます:

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

おそらくそれはあなたにとって満足のいくものでしょう。

于 2009-06-08T18:07:11.037 に答える
17

特に技術的な理由はありません。同種でない型の複数の宣言を許可する構文を考え出すことができたはずです。私たちがそうしなかったこと、そして異なるタイプのブロックを使用してネストされたブロックを宣言するための完全に優れた、明確で理解しやすく、かなり簡潔なメカニズムがすでにあることを考えると、いくつかのキーストロークを節約するためだけに新しい構文シュガーを追加することはほとんどありません.

于 2009-06-08T18:11:57.800 に答える
5

C# の他の変数宣言では、同じステートメントで同じ型の複数の変数を宣言することしかできません。usingヘッダーが異なる必要がある理由がわかりません。

于 2009-06-08T17:55:31.913 に答える
0

これを使用する私の個人的な方法は、法案に合うかもしれません:

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.
  }
}

いいえ、これはusing1 行に句の 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();
  }
}

これにより、コーディングが非常に快適になります。

于 2015-03-17T15:40:46.510 に答える