У меня проблемы с шаблоном C # 'Dispose'. Здесь у меня есть 3 класса: класс управления, форма и класс хранения данных.
Класс управления может (если это необходимо) использовать форму для запроса ввода данных пользователем. Форма загружает данные из файла, который пользователь затем может изменить. Поскольку это закрыто, форма должна сохранить эти данные обратно. Класс хранения данных реализует .Dispose (), который делает это - записывает изменения на диск.
Так как этот класс хранения данных (StoredInfo) является членом формы (MyForm), MyForm должен затем также реализовать .Dispose (), чтобы вызвать StoredInfo.Dispose. Это то, что вызывает у меня проблемы. Мой класс управления, в его коде:
Form.Dispose();
Form = null;
И моя форма:
// As written by MSVS. The exception is OK - I just want this to get called.
#region IDisposable Members
public void IDisposable.Dispose()
{
throw new NotImplementedException();
}
#endregion
... но метод Form.Dispose () никогда не вызывается. Шагая с отладчиком, выполнение идет:
Connector.Dispose() // The management class
Form.Dispose()
Form.Dispose(bool disposing) // (1) Some method designer wrote?
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
Connector.Dispose() // Back to the management class!
Form = null;
Мы как-то никогда не вызывали .Dispose, но вместо этого называли .Dispose (bool). В C ++, где аргументы могут иметь значения по умолчанию, я вижу это, но в C # я потерян. Я думаю, что мой отладчик не показывает мне, что на самом деле происходит.
Теперь, глядя на иерархию классов, я вижу другие классы, которые реализуют IDisposable - поэтому где-то должен быть другой член Dispose (). Это не виртуально, поэтому я не уверен, почему я не получаю ошибки компилятора. Я попытался переопределить метод .Dispose (bool), так как он вызывается, и является виртуальным, но с этим:
protected override void Dispose(bool disposing)
{
StoredHosts.Dispose();
}
Я получаю «Тип« ConnectorForm »уже определяет элемент с именем« Dispose »с теми же типами параметров», что, да, я полагаю, да… в коде Designer . Так что это не вариант. Итак, вернемся к вызову Dispose (). Но как? Мне не хватает простоты и мощи, а также детерминизма деструкторов C ++ на данный момент.