2009-12-02 9 views
12

try/catch/finall 블록이있는 메소드가 있습니다. 다음과 같이 try 블록 내에서, 나는 SqlDataReader 개체를 선언 : finally 블록에서Dispose() 호출 할 때 객체가 스코프/메소드 종료 됨 vs

   SqlDataReader aReader = null;   
       aReader = aCommand.ExecuteReader(); 

을 수동으로 배치되는 개체는 클래스 수준에서 설정되어있는 것들이다. 따라서 위의 SqlDataReader와 같은 IDisposable을 구현하는 메서드의 개체는 자동으로 처리됩니까? close()는 aReader에서 while 루프가 실행되어 Reader의 내용을 가져온 후 (Dispose()는 Close()를 호출 할 때와 같이) 호출됩니다. Close()에 대한 호출이 없으면 메서드가 끝나거나 객체가 범위를 벗어날 때이 객체를 자동으로 닫거나 처리하지 않을까요?

편집 : using() 문을 알고 있지만 나에게 혼란을주는 시나리오가 있습니다. 블록의 끝을 사용할 때 호출됩니다 (SqlDataReader 개체의 Close() 방법에 떨어져 통과)을 Dispose() 방법 - 감사

감사

답변

24

아니요, 개체가 범위를 벗어날 때 자동으로 삭제되지 않습니다.

가비지 수집시 많은 수의 IDisposable 객체가 최종적으로 폐기 될 수 있도록 "대체 (fallback)"최종자를 구현하지만 폐기 처리되지 않을 수도 있습니다.

using 블록에 포장하여 IDisposable 개체가 처리되도록 할 수 있습니다.

8

당신은 당신의는 IDisposable 개체를 포장하는 using {...} 블록을 사용한다. using을 사용하지 않으면 개체가 이 아니며 범위를 벗어날 때이 자동으로 삭제됩니다. 개체 마무리 도구가 있으면 가비지 수집시 리소스를 없애기 위해

using (SqlDataReader aReader = aCommand.ExecuteReader()) 
{ 
    // ... do stuff 
} // aReader.Dispose() called here 
-1

Using 성명이 도움이 될 수 있습니까?

1

Dispose 패턴은 어떤 객체가 다른 객체에서 Dispose를 호출하는지에 대한 어떠한 보장도하지 않습니다. 때로는 일어날 수 있지만 걱정하지 않아야합니다. 대신, 모든 IDisposable 개체에 대해 Dispose()가 호출되도록하는 것은 사용자의 책임입니다. 가장 좋은 방법은 using 문을 사용하는 것입니다. 예 :

using (SqlDataReader aReader = aCommand.ExecuteReader()) 
{ 
    // your code 
} 
0

나는 "finally 블록에서 수동으로 처리되는 객체는 클래스 수준에서 설정되는 객체입니다."라고 당황 스럽습니다. 클래스 수준에서 설정된 객체로 필드를 의미합니까? 필드의 수명은 예측할 수 없으며, 호출 한 방법에 따라 다르므로 보통 방법으로 처리하면 안됩니다. IDisposable을 구현하고 Dispose 메서드에서 필드를 삭제하는 것이 좋습니다.

1

나는 모두 위에 동의합니다. Dispose()에게 직접 전화해야합니다. 가장 쉬운 방법은 using입니다.이 방법은 finally 블록에서 직접 처리 할 수도 있습니다.이 방법은 더 장황하지만 때로는 필요합니다. 이 작업을 수행하지 않으면 응용 프로그램이 핸들 또는 심지어 관리되지 않는 메모리와 같은 관리되지 않는 리소스를 유출 할 수 있습니다. 특히이 COM 구성 요소의 일부가 사용 중이거나 Win32 API로 호출되는 경우가 있습니다.이는 과도한 자원 사용뿐만 아니라 성능 및 안정성 문제로 이어질 수 있습니다.

IDisposable을 구현하는 개체가 Dispose(bool disposing) 메서드를 호출하여 관리되지 않는 리소스를 해제해야하는 finalizer를 구현해야한다고해서이 작업이 수행 될 것이라는 보장이 없으므로이 인스턴스에 의존해서는 안됩니다. 이 지점에 대한 자세한 내용은 http://msdn.microsoft.com/en-us/library/b1yfkh5e%28VS.71%29.aspx을 참조하십시오.

또한주의해야 할 점은 유형에 일회용 멤버가있는 경우 해당 유형의 멤버가 IDisposable (해당 멤버의 수명주기가 분명히 지저분해질 수있는 다른 유형으로 관리되지 않는 한)을 구현해야한다는 것입니다. 또는 하나의 메소드에서만 이러한 멤버를 사용하거나 하나의 특정 기능을 구현하는 경우이를 사용하는 메소드에서 로컬 변수/매개 변수를 만드는 것을 고려해야합니다.

관련 문제