2

重複の可能性:
メソッドのusingブロック内で値を返す場合、usingは返す前にオブジェクトを破棄しますか?

私はこのコードを持っています(単純化):

bool method1()
{
      using (OleDbConnection con = new OleDbConnection(connString))
            {
                bool b = false;

                try
                {
                    con.Open();
                    b = true;

                }
                catch (Exception)
                {
                    b = false;
                }
                finally
                {
                    con.Close();
                    return b;
                }                
            }
}

「using」ステートメントの閉じ中括弧の前に戻ります。とにかく私のオブジェクト「con」は破棄されますか?次のコードを使用する方が良いですか?:

bool method1()
{
      bool b = false;
      using (OleDbConnection con = new OleDbConnection(connString))
            {
                try
                {
                    con.Open();
                    b = true;

                }
                catch (Exception)
                {
                    b = false;
                }
                finally
                {
                    con.Close();                    
                }                
            }

        return b;
}
4

5 に答える 5

4

ステートメントの要点はusing、usingブロック内から未処理の例外がスローされた場合でも、オブジェクトの破棄を自動化することです。

したがって、コードがusingブロックを終了すると、それが返されるかどうかに関係なく、「使用されている」オブジェクトは破棄されます。

于 2013-01-12T14:35:54.070 に答える
2

オブジェクトの廃棄を自動的に処理する.NETの魔法により、usingステートメント中に戻るのは完全に安全です。全体的な考え方は、usingブロックをどのように終了するかを考える必要はなく、そのままにしておくとオブジェクトが正しく配置されることを知っているだけです。そのため、例は次のように簡略化できます。

bool method1()
{
    using (OleDbConnection con = new OleDbConnection(connString))
        {
            try
            {
                con.Open();
                return true;
            }
            catch (Exception)
            {
                return false;
            }          
    }
}

con.Close()は削除することができ、廃棄によって自動的に呼び出されます。

内部で何が起こっているかを確認したい場合は、これを見てください。

于 2013-01-12T14:44:21.240 に答える
1

最初の例では、一時変数を設定してそれを返します。

finallyでの戻りについて:コンパイル後に起こることは、メソッドの最後に分岐してから一時変数を返すことです。

たとえば、結果はまったく同じです。明確にするために、私は個人的に最初のものを好みます。なぜなら、それはより正確に起こることに似ているからです。

于 2013-01-12T14:43:16.607 に答える
1

2つのコードセクションに違いはありません。conオブジェクトは両方の例で破棄されます。

于 2013-01-12T14:35:38.767 に答える
0

usingif次のような追加のステートメントを使用して、やや複雑に拡張します

OleDbConnection con = new OleDbConnection(connString)
try
{
    con.Open();
}
finally
{
    // Check for a null resource.
    if (con != null)
        // Call the object's Dispose method.
        ((IDisposable)con).Dispose();
}  

したがって、あなたの例ではNullReferenceException、finallyブロックに入る可能性があります。

したがって、操作と破棄およびオブジェクトのステータスを返したい場合は、このコードスニペットを使用することをお勧めします

using(OleDbConnection con = new OleDbConnection(connString))
{
    try
    {
        con.Open();
        return true;
    }catch(OleDbException ex)
    {
        //log error
        return false;
    }
}
于 2013-01-12T14:44:28.467 に答える