Как объявить объект другого класса в конструкторе и иметь возможность работать с ним в деструкторе?
У меня есть вот такой код:
class Myclass{
public Myclass():SqliteCommand
{
SqliteConneciton connection = new SqliteConnection();
this.Connection = conneciton; // Это к слову, зачем мне вообще это всё
connection.Open();
}
/* Какие то другие методы */
~Myclass()
{
connection.Close();// Но это естественно не работает(
}
}
Здесь я в конструкторе создаю экземпляр класса SqliteConneciton();. Вопрос, как мне работать с этим экземпляром в деструкторе (пытался записать его в переменную var connection = new SqliteConnection(). Но это переменная локальная и этот подход тоже не работает
Ответы (1 шт):
Автор решения: aepot
→ Ссылка
Здесь надо понять просто правила работы с IDisposable объектами.
class MyClass : IDisposable
{
private bool disposed;
private readonly SqliteConnection connection;
public MyClass()
{
connection = new SqliteConnection();
connection.Open();
}
public void Dispose()
{
Dispose(true);
GC.SupressFinalize(this); // предотвращает последующий вызов финализатора
}
private void Dispose(bool disposing)
{
if (disposing)
{
if (disposed)
throw new ObjectDisposedException(nameof(MyClass));
// здесь выполняется очистка управляемых ресурсов
// другими словами, не нужно диспозить объекты при вызове из финализатора
connection.Dispose();
}
// здесь обычно выполняется очистка неуправляемых ресурсов
// но у вас их нет
disposed = true;
}
~MyClass()
{
Dispose(false);
}
}
В данном конкретном случае поле connection не рекомендуется делать публичным.
Далее все как с любым другим IDisposable классом:
using var instance = new MyClass();
// ...
или для старых версий C# вот так:
using (var instance = new MyClass())
{
// ...
}