[c#] using 문 내에서 예외가 throw되면 Dispose가 계속 호출됩니까?

아래 예에서 연결이 using문 내에있는 경우 예외가 throw되면 연결이 닫히고 삭제 됩니까?

using (var conn = new SqlConnection("..."))
{
    conn.Open();
    // stuff happens here and exception is thrown...
}

아래의 코드가이를 확인한다는 것을 알고 있지만 using 문이 어떻게 작동하는지 궁금합니다.

var conn;
try
{
    conn = new SqlConnection("...");
    conn.Open();
    // stuff happens here and exception is thrown...
}
// catch it or let it bubble up
finally
{
    conn.Dispose();
}

관련 :

예외가 발생할 때 SQL 연결이 닫히도록하는 적절한 방법은 무엇입니까?



답변

예, 부분이 존재하는 경우 호출 할 usingtry / finally 블록에 코드를 래핑 합니다. 그러나 구현중인 인터페이스와 그에 따른 메서드 만 확인하므로 직접 호출하지 않습니다 .finallyDispose()Close()IDisposableDispose()

또한보십시오:


답변

리플렉터가 코드에 의해 생성 된 IL을 디코딩하는 방법은 다음과 같습니다.

private static void Main (string [] args)
{
    SqlConnection conn = new SqlConnection ( "...");
    시험
    {
        conn.Open ();
        DoStuff ();
    }
    드디어
    {
        if (conn! = null)
        {
            conn.Dispose ();
        }
    }
}

그래서 대답은 ‘예’입니다.

DoStuff ()

예외가 발생합니다.


답변

Dispose ()는이 코드에서 호출되지 않습니다.

class Program {
    static void Main(string[] args) {
        using (SomeClass sc = new SomeClass())
        {
            string str = sc.DoSomething();
            sc.BlowUp();
        }
    }
}

public class SomeClass : IDisposable {
    private System.IO.StreamWriter wtr = null;

    public SomeClass() {
        string path = System.IO.Path.GetTempFileName();
        this.wtr = new System.IO.StreamWriter(path);
        this.wtr.WriteLine("SomeClass()");
    }

    public void BlowUp() {
        this.wtr.WriteLine("BlowUp()");
        throw new Exception("An exception was thrown.");
    }

    public string DoSomething() {
        this.wtr.WriteLine("DoSomething()");
        return "Did something.";
    }

    public void Dispose() {
        this.wtr.WriteLine("Dispose()");
        this.wtr.Dispose();
    }
}


답변