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