developer tip

명령문 사용이 끝나기 전에 돌아 오면 어떻게됩니까?

optionbox 2020. 7. 27. 07:52
반응형

명령문 사용이 끝나기 전에 돌아 오면 어떻게됩니까? 처분이 호출됩니까?


나는 다음 코드를

using(MemoryStream ms = new MemoryStream())
{
     //code
     return 0;
}

dispose()메소드는 using명령문 중괄호 끝에 호출됩니다 }. 나는 이후 return의 끝나기 전에 using문, 의지 MemoryStream객체가 제대로 배치 할 수? 여기서 어떻게됩니까?


그렇습니다 Dispose. 실행이 using블록을 떠나는 데 어떤 의미가 있는지, 블록의 실행이 끝났는지, return명령문 또는 예외 인지에 관계없이 실행이 블록 의 범위 를 벗어나 자마자 호출됩니다 .

@Noldorin 올바르게 사용하여 지적 하듯이 using코드 블록을 컴파일 도착 try/ finallyDispose에서 호출되는 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...


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.

참고URL : https://stackoverflow.com/questions/3247617/what-happens-if-i-return-before-the-end-of-using-statement-will-the-dispose-be

반응형