C # 2008
나는이 문제에 대해 잠시 동안 노력해 왔으며 여전히 코드에서 finalize 및 dispose 메서드를 사용하는 것에 대해 혼란스러워합니다. 내 질문은 다음과 같습니다.
관리되지 않는 리소스를 처리하는 동안 종료자가 필요하다는 것을 알고 있습니다. 그러나 관리되지 않는 리소스를 호출하는 관리되는 리소스가있는 경우 여전히 종료자를 구현해야합니까?
그러나 관리되지 않는 리소스를 직접 또는 간접적으로 사용하지 않는 클래스를 개발하는 경우
IDisposable
해당 클래스의 클라이언트가 'using statement'를 사용할 수 있도록를 구현해야 합니까?클래스의 클라이언트가 using 문을 사용할 수 있도록 IDisposable을 구현하는 것이 가능합니까?
using(myClass objClass = new myClass()) { // Do stuff here }
Finalize / dispose 사용을 보여주기 위해 아래의 간단한 코드를 개발했습니다.
public class NoGateway : IDisposable { private WebClient wc = null; public NoGateway() { wc = new WebClient(); wc.DownloadStringCompleted += wc_DownloadStringCompleted; } // Start the Async call to find if NoGateway is true or false public void NoGatewayStatus() { // Start the Async's download // Do other work here wc.DownloadStringAsync(new Uri(www.xxxx.xxx)); } private void wc_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e) { // Do work here } // Dispose of the NoGateway object public void Dispose() { wc.DownloadStringCompleted -= wc_DownloadStringCompleted; wc.Dispose(); GC.SuppressFinalize(this); } }
소스 코드에 대한 질문 :
여기서는 종료자를 추가하지 않았으며 일반적으로 GC에서 종료자를 호출하고 종료자가 Dispose를 호출합니다. 파이널 라이저가 없으므로 Dispose 메서드를 언제 호출해야합니까? 그것을 호출 해야하는 클래스의 클라이언트입니까?
따라서 예제에서 내 클래스는 NoGateway라고하며 클라이언트는 다음과 같이 클래스를 사용하고 폐기 할 수 있습니다.
using(NoGateway objNoGateway = new NoGateway()) { // Do stuff here }
실행이 using 블록의 끝에 도달하면 Dispose 메소드가 자동으로 호출됩니까? 아니면 클라이언트가 dispose 메소드를 수동으로 호출해야합니까? 즉
NoGateway objNoGateway = new NoGateway(); // Do stuff with object objNoGateway.Dispose(); // finished with it
WebClient
수업에서 수업을 사용하고NoGateway
있습니다. 인터페이스를WebClient
구현 하기 때문에 관리되지 않는 리소스IDisposable
를WebClient
간접적으로 사용 한다는 의미 입니까? 이것을 따라야하는 어렵고 빠른 규칙이 있습니까? 클래스가 관리되지 않는 리소스를 사용한다는 것을 어떻게 알 수 있습니까?