2011-01-11 6 views
0

"Close"기능이있는 스트림과 같은 클래스가 있습니다. 이 클래스의 인스턴스는 필드/속성에 저장됩니다. 때로는이 인스턴스를 새 인스턴스로 대체해야합니다. 불행히도 누군가가 여전히 객체의 이전 인스턴스를 사용하는지 알 수 없습니다. (많은 많은 함수가이 필드를 멀티 스레딩과 함께 사용합니다). 그래서 클래스를 닫지 않고 필드를 덮어 쓸 수 있습니다. GC가 닫히지 않은 객체를 제거 할 것이라고 기대할 수 있습니까? 아니면 처분 함수에서 닫을 수 있습니까?가비지 수집기가 스트림을 닫을 것으로 예상 할 수 있습니까?

감사합니다.

답변

4

클래스는 implementingIDisposable이어야하며 그 사용자는 using statement으로 인스턴스화해야합니다.

올바른 폐쇄/폐기가 보장됩니다.

GC는 아직 참조 된 클래스를 닫거나 처리하지 않으므로 실제로 작성한 코드와 클래스가 사용되는 방식에 따라 달라집니다.

+0

OP 클래스는 Stream 클래스가 결국 필요한 기본 객체에 대해 Dispose를 호출하는 것처럼 Close()를 노출 할 수 없습니다. –

+0

@Aaron - 동의하고 아마도 _ 그럴 수 있습니다. 'dispose' 구현은 닫을 수 있어야합니다. 하지만 올바른 방법으로 코드를 사용하면 버그가 발생합니다. – Oded

+0

불행히도, 그게 dispose 패턴이 필요합니다.GC가 메모리 이외의 관리되지 않는 리소스를 추적하는 것을 제외하고는 코드 사용자가 정리를 보장하기 위해 특별한 단계 (예 : 'using'문)를 사용하는 것을 제외하고는 관리되지 않는 리소스가 정리되도록 보장 할 수있는 방법이 없습니다. – siride

1

당신은 단지 파기하는 방법으로 닫을 수 없습니다, 그러나 당신이 가장 좋아하는 스트림으로, 그것을 닫습니다이 는 가비지 컬렉터가 돌볼 수없는 관리되지 않는 리소스를 포함합니다. 항상 Dispose 클래스를 완료 한 경우 IDisposable을 구현하는 클래스입니다.

클래스에 IDisposable을 구현하는 클래스를 사용하는 경우 클래스도 인터페이스를 구현해야합니다.

1

FileStream 외. Dispose()을 호출하는 Finalize() 메서드가 있어야합니다. 핸들이 결국 닫히도록 보장하는 것이 사실이지만 결정적이지는 않습니다. 수동으로 스트림을 직접 닫을 수 있다면 매우 좋습니다. Finalize() 메서드는 스트림이 수동으로 닫히지 않는 경우를 대비하여 (대개 논리의 버그로 인해) 거기에만 있습니다.

이렇게 되더라도 Finalize() 방법도 100 % 보장받을 수는 없습니다. 그러나 프로그램이 종료되면 모든 핸들이 OS에 의해 닫힙니다.

0

클래스에 finalizer가 있으면 yes입니다. 그러나, 당신의 묘사를 생각해 보면, 그것은 중요한 것이 아닙니다.

대부분이 클래스가 IDisposable을 구현하기를 원할 때 가능한 한 빠른 시간에 관리되지 않는 리소스 (또는 소유 된 일회용 인스턴스)를 해제 할 수 있습니다.

그러나 더 큰 디자인 문제가있는 것 같습니다. 입력란을 제어 할 수 있다고 가정하면 을 알고 있어야합니다. 새 인스턴스를 만들거나 처분 할 때 안전합니다. 분명히 당신은 그 인스턴스의 확실한 소유권이없는 무언가없이 쓰레드에서 공유 된 인스턴스를 가지고 있습니다. 코드가 없으면보다 자세한 설명이 가능할 수 있습니다. 잘못된 것일 수도 있지만 사고가 발생하기를 기다리는 것처럼 들립니다.

관련 문제