2011-11-23 2 views
13

가능한 중복이 : 데이터베이스에 액세스 할 때
Does Dispose method still get called when Exception is thrown inside of Using statment?사용 블록에서 예외가 발생하더라도 리소스가 삭제됩니까?

나는 using 블록의 수를 가지고있다. 궁금 해서요 - 사용하는 블록 내에서 예외를 던져야하는 경우에도 블록의 끝 부분에 도달하지 않아도 필요한 리소스가 여전히 처분됩니까? 또는 catch 블록에서 수동으로 직접 닫아야합니까?

답변

26

using 문으로 정의 된 리소스가 삭제 되었기 때문에 이것이 using에 적합한 주된 이유입니다.

using 문은 객체의 메소드를 호출하는 동안 예외가를 발생하더라도 폐기가 라고 보장합니다. 은 try 블록 안에 객체를 넣음으로써 동일한 결과를 얻을 수 있으며, 은 finally 블록에서 Dispose를 호출합니다. 사실, 이것은 using 문이 컴파일러에 의해 어떻게 변환되는지입니다.
http://msdn.microsoft.com/en-us/library/yh598w02%28v=VS.100%29.aspx

+1

+1 설명에 대한 링크는 15 초입니다. 나보다 더 빨리. ;-) – Fischermaen

+0

고마워! 그냥 대답을 받아들이는 타이머를 기다리고 :) –

+0

그리고 그 사이에 나는 -1을 얻는다. – Fischermaen

1

예, 사용하는 블록의 자원 배치 될 것이다.

1

그렇지 않을 수도 있습니다. 사실 using 블록은 finally 블록에 Dispose 메서드 호출을 사용하여 try{}catch{}finally{} 구조를 사용하는 경우 동일합니다. 어쨌든 부름을받을 것입니다.

1

예, 전화는 이 번역 된 try 블록의 finally 블록의 일부이기 때문에 처리됩니다. 는 C# 사양의 8.13에서

:

사용하여 문이 세 부분으로 번역된다

: 수집, 사용, 및 폐기. 리소스 사용은 finally 절이 포함 된 try 문에 암시 적으로 포함됩니다. 이 finally 절은 의 리소스를 처리합니다. null 리소스를 취득했을 경우는, Dispose 에의 호출은 행해지 지 않고, 예외는 슬로우되지 않는다.

따라서 수동으로 처리 할 필요가 없으며이 경우 어쨌든 자신의 catch 블록이 어디에 있는지 확신 할 수 없습니다.

관련 문제