2010-12-03 2 views
1

나는 항상 이러한 행위를 사용해야 ...문 OR 함수 종료를 사용하여 리소스를 처리/종료합니다?

Public Function DoWork() 

    Using dc as New myDataContext() 

     ... 

    End Using 

End Function 

또는 충분히 좋은 기능을 종료하고 같은 일을합니까? 끝 DataContext를 자원의 처분의 관점에서 사용으로

Public Function DoWork() 

    Dim dc as New myDataContext() 

    ... 

End Function 

종료 기능은 동일한 작업을 수행 종료합니까?

+3

.NET에서 프로그래밍 한 적이 한 번도 없지만 그 주제가 일주일에 세 번 나옵니다. 평균 .NET 프로그래머가 자신의 언어에 대해이 사실을 조금 알고 있습니까? – delnan

답변

4

완전히 다릅니다.

개체가 IDisposable 인 경우 항상 처분해야합니다. 가장 쉬운 방법은 using 블록으로 묶는 것입니다.

(그리고 객체가 IDisposable를 구현하지 않습니다 당신이 그것을 폐기하거나 당신이 원하더라도, 어쨌든 using를 사용할 수없는 경우.)

+0

함수 내부에서 Using 블록을 사용할 때 For/Next Loop 등에서 Exit 함수를 호출해야 할 때 시나리오를 어떻게 처리합니까? – EdenMachine

+3

'using' 블록이 그 상황을 처리 할 것입니다. 이것은 기본적으로'try ... finally'로 번역되며'finally' 블록은 객체에 Dispose가 호출되도록합니다. – LukeH

+0

@EdenMachine 왜 이것이 문제가됩니까? 함수에서 돌아 오거나 예외를 던지더라도'using' 문 범위를 벗어날 때 객체가 삭제됩니다. 그것은 치명적인 실패의 경우에만 실행되지 않습니다 (OutOfMemory, ...) – CodesInChaos

4

using 문의 목적은 객체에 Dispose를 호출하는 것입니다 IDisposable을 구현합니다. 수동으로 수행하는 방법은 try...finally 문이지만 훨씬 더 바람직하지 않습니다.

이 함수를 종료해도 Dispose이 호출되지 않습니다. 지역 변수는 범위를 벗어나 개체를 더 이상 참조하지 않습니다. 객체에 더 이상 참조가 없다는 것은 즉각적인 반응을 일으키지 않습니다. GC 번호 일 수 있습니다.

GC가 수집 할 때까지 네이티브 리소스가 남아 있기 때문에 훨씬 나중에 가능합니다. 또는 Dispose 내부에서 제거 된 해당 객체에 대한 다른 참조가있는 경우 전혀 수집되지 않을 수도 있습니다. 보시다시피

{ 
    ResourceType resource = expression; 
    try { 
     statement; 
    } 
    finally { 
     if (resource != null) ((IDisposable)resource).Dispose(); 
    } 
} 

finally 무슨 일이 일어나는 상관없이 처분 호출을 담당 : 참조 형식에

Using statement in the VB.net specification

그리고 C#에서

(VB.net은 매우 유사해야합니다) using는에 해당 statement. 마지막으로 함수를 종료하거나 예외를 throw하더라도 실행됩니다.
OutOfMemory, StackOverflow 및 강제 app-domain 언로드와 같은 단지 몇 가지 재앙적인 오류는이를 실행하지 않습니다.

+0

그리고 이로 인해 메모리 부족 또는 연결 풀 시간 초과가 발생할 수 있습니다. – Steven

관련 문제