엄밀히 말하면, IDisposable
을 구현하고 범위가 해당 기능으로 제한되는 모든 객체는 using
블록 내에 있어야합니다. IDisposable
인터페이스는 관리되지 않는 리소스 (데이터베이스 연결, 파일 핸들, 창 핸들 등)를 처리하는 클래스가 이러한 리소스를 적시에 결정적으로 처리 할 수 있도록합니다. 있다
, 일반적으로 세 가지 방법은에서 IDisposable
객체는 클래스 내에서 사용됩니다
- 목적은 모두 만들어 더 이상 하나의 메소드 호출의 범위 내에서 필요하다. 이것은 매우 일반적이며,
using
을 사용할 수 있고 사용할 수 있어야합니다.
- 개체는 클래스에 의해 만들어지며 (또는 클래스에 전달됩니다.) 개체의 수명은 단일 메서드 호출의 범위를 넘어 확장되지만 해당 클래스의 수명을 초과하지 않습니다. 예를 들어, 클래스는
Stream
을 만들고 그 객체의 수명 동안 사용해야합니다. 이 경우 클래스는 IDisposable
자체를 구현하고 자신의 Dispose
메서드가 호출 될 때 소유하고있는 객체를 처리해야합니다. 예를 들면 다음과 같습니다. System.IO.StreamWriter
- 개체가 클래스에 전달되었지만 클래스가 해당 개체를 "소유"하지 않습니다. 즉,
IDisposable
개체의 사용 가능한 수명은 단일 메서드 호출의 범위를 벗어나며 개체 수명보다 길 수 있습니다. 이 경우 다른 사람이 Dispose
에게 전화해야합니다.
첫 번째 경우가 가장 자주 발생하며, 이는 using
블록이 존재하는 이유입니다. 예외가 발생한 경우에도 객체가 처리되도록 보장합니다.
몇 가지 예 :
IDisposable
를 구현하는 클래스의 더 완전한 목록은이 목록이 상당히 큰 것 같이 없습니다 및 당신은 결코 만날 수없는 수업으로 가득 차 있습니다. 클래스 이 어떤 일을하는지 생각해보십시오.; 어떤 종류의 연결이나 파일을 열어야합니까? 일반적으로 은 어떤 종류의 리소스를 확보해야합니까?? 그렇다면, 아마 그것을 구현합니다. 기본 레벨에서 컴파일러가 using
으로 묶을 수있게하면 IDisposable
을 구현합니다.
의 결과에 대해서는이 아니고, Dispose
으로 전화하는 것은 고려하지 마십시오. 통화 처분. 사실, 방어적인 표준은 관리되지 않는 리소스 을 직접 사용하여을 사용하는 경우 객체를 수집하고 다른 사람이 호출하지 못했지만 디자인이 아니어야하는 경우 dispose를 호출하는 finalizer를 정의해야합니다. 선택. 나는 지금까지 알고있다. 클래스의 준비 계산하는 사람이 using
와 전화
부분적인 대답은 http://stackoverflow.com/questions/2988321/how-to-find-all-classes-implemeting-idisposable을 참조하십시오. – apoorv020