2

私はまだC#に比較的慣れておらず、「IDisposables」にさらされたのは過去数日だけです。usingメソッドを呼び出すことを手動で覚える必要なく、破棄する必要があるオブジェクトを処理するためのブロックの概念を把握できます.Dispose()- 便利です!

ただし、ステートメントSqlConnection内で処理する new から始めるとしましょう。usingそのコード ブロック内で、追加の IDisposables をいくつか作成しますSqlDataAdapterusingそのアダプターには独自のステートメントが必要ですか?

たとえば、コードがある場合...

using (SqlConnection myConnection = new SqlConnection())
{
    SqlCommand myCommand = new SqlCommand();
    SqlDataAdapter myAdapter = new SqlDataAdapter();
    // Do things
}

... が破棄myCommandmyAdapterれるときにmyConnection破棄されますか (それらはそのコード ブロックの範囲内にあるため)? usingまたは、次のような複数のステートメントが必要ですか。

using (SqlConnection myConnection = new SqlConnection())
{
    using (SqlCommand myCommand = new SqlCommand())
    {
        using (SqlDataAdapter myAdapter = new SqlDataAdapter())
        {
            // Do things
        }
    }
}
4

3 に答える 3

7

厳密に言えば、全部処分したほうがいいです。ただし、それらを直接ネストすることでインデントを回避できます。

using (var myConnection = new SqlConnection())
using (var myCommand = new SqlCommand())
using (var myAdapter = new SqlDataAdapter())
{
    // Do things
}

あるいは、特に ADO.NET の場合 (公平に言えば、多くの破棄可能な型があります)、配管の多くを隠すライブラリの 1 つを使用する方が簡単な場合があります。たとえば、 "ダッパー":

using(var conn = new SqlConnection(...))
{
    return conn.Query<Customer>(
        "select * from Customers where Region=@region",
        new { region }).ToList();
}
于 2013-09-28T14:43:37.533 に答える
0

使用するのは、シンタックス シュガーです。

            var connection = new Connection();
        try
        {
            connection.DoSomething();
        }
        finally
        {
            // Check for a null resource.
            if (connection != null)
            {
                ((IDisposable)connection).Dispose();
            }
        }

そうです、これらすべてを確実に破棄するには、ネストされた using ステートメントが必要です

于 2013-09-28T14:43:08.010 に答える