С# 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, означает ли это, что веб-клиент косвенно использует неуправляемые ресурсы? Существует ли жесткое и быстрое правило следовать этому? Как узнать, что класс использует неуправляемые ресурсы?