Как объявить объект другого класса в конструкторе и иметь возможность работать с ним в деструкторе?

У меня есть вот такой код:

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())
{
    // ...
}
→ Ссылка