С# 2008
Я работаю над этим некоторое время, и я все еще смущен некоторыми проблемами. Мои вопросы ниже
-  Я знаю, что вам нужен только финализатор, если вы распоряжаетесь неуправляемыми ресурсами. Однако, если вы используете управляемые ресурсы, которые вызывают вызовы неуправляемым ресурсам, вам все равно нужно реализовать финализатор? 
-  Однако, если вы разрабатываете класс, который не использует неуправляемые ресурсы, прямо или косвенно, можете ли вы реализовать IDisposable, чтобы клиенты вашего класса могли использовать "using statement"?Было бы приемлемо реализовать IDisposable только для того, чтобы клиенты вашего класса могли использовать оператор using? 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 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 }Будет ли автоматически вызываться метод Dispose, когда выполнение достигнет конца используемого блока, или клиент должен вручную вызвать метод dispose? то есть. NoGateway objNoGateway = new NoGateway(); // Do stuff with object objNoGateway.Dispose(); // finished with it
-  Я использую класс webclient в классе NoGateway. Поскольку веб-клиент реализует интерфейс IDisposable, означает ли это, что веб-клиент косвенно использует неуправляемые ресурсы? Существует ли жесткое и быстрое правило следовать этому? Как узнать, что класс использует неуправляемые ресурсы?
