명령문 사용이 끝나기 전에 돌아 오면 어떻게됩니까? 처분이 호출됩니까?
나는 다음 코드를
using(MemoryStream ms = new MemoryStream())
{
//code
return 0;
}
이 dispose()
메소드는 using
명령문 중괄호 끝에 호출됩니다 }
. 나는 이후 return
의 끝나기 전에 using
문, 의지 MemoryStream
객체가 제대로 배치 할 수? 여기서 어떻게됩니까?
그렇습니다 Dispose
. 실행이 using
블록을 떠나는 데 어떤 의미가 있는지, 블록의 실행이 끝났는지, return
명령문 또는 예외 인지에 관계없이 실행이 블록 의 범위 를 벗어나 자마자 호출됩니다 .
@Noldorin 올바르게 사용하여 지적 하듯이 using
코드 블록을 컴파일 도착 try
/ finally
과 Dispose
에서 호출되는 finally
블록. 예를 들어 다음 코드는 :
using(MemoryStream ms = new MemoryStream())
{
//code
return 0;
}
효과적으로된다 :
MemoryStream ms = new MemoryStream();
try
{
// code
return 0;
}
finally
{
ms.Dispose();
}
따라서 블록이 실행을 완료 finally
한 후에는 try
실행 경로에 관계없이 실행 Dispose
이 보장되므로 무엇이든 호출이 보장됩니다.
자세한 내용은 이 MSDN 기사를 참조하십시오 .
부록 :
추가해야 할 약간의 경고 : Dispose
호출이 보장 되므로 거의 항상 Dispose
구현할 때 예외가 발생하지 않도록하는 것이 좋습니다 IDisposable
. 불행하게도, 핵심 라이브러리의 일부 클래스가 어떻게 특정 상황에 던져 Dispose
내가 당신을 찾고 있어요, WCF 서비스 참조 / 클라이언트 프록시 -라고는! 이런 상황이 발생 Dispose
하면 예외 스택 풀기 중에 호출 된 경우 원래 예외가 Dispose
호출에 의해 생성 된 새 예외에 찬성 하여 원래 예외를 추적하는 것이 매우 어려울 수 있습니다 . 매우 실망 스러울 수 있습니다. 아니면 실망 스러운가? 둘 중 하나. 아마 둘 다
using
문은 try ... finally
블록 과 똑같이 동작 하므로 항상 모든 코드 종료 경로에서 실행됩니다. 그러나 finally
블록이 호출되지 않는 매우 드물고 드문 상황에 해당한다고 생각 합니다. 내가 기억할 수있는 한 가지 예는 배경 스레드가 활성화되어있는 동안 전경 스레드가 종료되는 경우입니다 .GC를 제외한 모든 스레드가 일시 중지되어 finally
블록이 실행되지 않습니다.
명백한 편집 : 그것들은 IDisposable 객체 d' oh를 처리 할 수있는 논리와는 별도로 작동합니다.
보너스 내용 : 스택 가능 (유형이 다른 경우) :
using (SqlConnection conn = new SqlConnection("string"))
using (SqlCommand comm = new SqlCommand("", conn))
{
}
또한 쉼표로 구분됩니다 (유형이 같은 경우).
using (SqlCommand comm = new SqlCommand("", conn),
SqlCommand comm2 = new SqlCommand("", conn))
{
}
MemoryStream 객체가 올바르게 배치되므로 걱정할 필요가 없습니다.
으로 using
문 개체 관계없이 완료 경로 처리한다.
Further reading...
- http://aspadvice.com/blogs/name/archive/2008/05/22/Return-Within-a-C_2300_-Using-Statement.aspx
- http://csharpfeeds.com/post/8451/Return_Within_a_Csharp_Using_Statement.aspx
Take a look at your code in reflector after you compile it. You'll find that the compiler refactors the code to ensure that dispose is called on the stream.
'developer tip' 카테고리의 다른 글
gemspec에서 유효하지 않은 날짜 형식 지정 (0) | 2020.07.28 |
---|---|
공유 라이브러리없이 GMP, MPFR, MPC, ELF를 사용하여 GCC를 개별적으로 설치하는 방법은 무엇입니까? (0) | 2020.07.28 |
git remote prune – 예상대로 많은 가지 가지가 보이지 않았습니다. (0) | 2020.07.27 |
인덱스없이 팬더 DataFrame을 인쇄하는 방법 (0) | 2020.07.27 |
프로그래밍 방식으로 환율에 액세스 (0) | 2020.07.27 |