C # 2008
Я над цим працюю вже деякий час, і я все ще плутаюсь щодо використання методів доопрацювання та розпорядження кодом. Мої запитання нижче:
Я знаю, що нам потрібен лише фіналізатор під час розміщення некерованих ресурсів. Однак якщо є керовані ресурси, які здійснюють дзвінки на некеровані ресурси, чи все-таки потрібно буде застосувати фіналізатор?
Однак, якщо я розробляю клас, який не використовує жодних некерованих ресурсів - прямо чи опосередковано, чи слід реалізувати,
IDisposable
щоб дозволити клієнтам цього класу користуватися оператором "using"?Чи можливо реалізувати IDisposable просто для того, щоб клієнти вашого класу могли використовувати оператор, що використовує?
using(myClass objClass = new myClass()) { // Do stuff here }
Нижче я розробив цей простий код, щоб продемонструвати завершення використання:
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, коли виконання досягне кінця блоку, або клієнт повинен вручну викликати метод розпорядження? тобто
NoGateway objNoGateway = new NoGateway(); // Do stuff with object objNoGateway.Dispose(); // finished with it
Я використовую
WebClient
клас у своємуNoGateway
класі. ОскількиWebClient
реалізуєIDisposable
інтерфейс, чи означає це, щоWebClient
опосередковано використовуються некеровані ресурси? Чи існує чітке і швидке правило для цього? Як я можу знати, що клас використовує некеровані ресурси?