아래 예에서 연결이 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();
}
관련 :
답변
예, 부분이 존재하는 경우 호출 할 using
try / finally 블록에 코드를 래핑 합니다. 그러나 구현중인 인터페이스와 그에 따른 메서드 만 확인하므로 직접 호출하지 않습니다 .finally
Dispose()
Close()
IDisposable
Dispose()
또한보십시오:
답변
리플렉터가 코드에 의해 생성 된 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();
}
}