Можем ли мы использовать метод Dispose без реализации интерфейса IDisposable?

Можем ли мы использовать метод Dispose без реализации интерфейса IDisposable?

3 ответа

Вы можете назвать метод как Dispose и использовать его как обычный метод без каких-либо ограничений:

public class MyClass {
  public void Dispose() {
    ...
  }
}
...

// using() emulation
MyClass m = null;

try {
  m = new MyClass();
  ...
}
finally {
  if (m != null)
    m.Dispose();
}

но если ты хочешь using() синтаксис вы должны реализовать IDisposable:

  public class MyNextClass: IDisposable {
    protected virtual void Dispose(Boolean disposing) {
      ...
    }

    public void Dispose() {
      Dispose(true);
      GC.SuppressFinalize(this);   
    }
  }
  ...
  // compare this with the using() emulation in the code above
  using (MyNextClass n = new MyNextClass()) {
    ...
  }

Во всяком случае, даже можно назвать метод Dispose не стоит удивлять (и, наконец, раздражать) разработчиков (включая вас), которые читают ваши тексты; так что либо реализуй IDisposable или найдите другое имя для метода.

Никто не помешает вам сделать это, но это очень плохой дизайн, потому что все знают об однозначном интерфейсе. Если вы придаете этому методу другое значение, вы запутываете свой дизайн тому, кто позже взглянет на ваш код. Может быть, даже через несколько лет вы сами не помните причину, по которой вы это сделали.

Управляемые объекты удаляются автоматически, даже если вы не реализуете IDisposableIDisposable позволяет вам определять, какая среда выполнения не будет располагаться как файлы, open обрабатывает компоненты неуправляемого кода.

Реализация метода утилизации

Шаблон для удаления объекта, называемый шаблоном удаления, налагает порядок на время существования объекта. Шаблон dispose используется только для объектов, которые обращаются к неуправляемым ресурсам, таким как дескрипторы файлов и каналов, дескрипторы реестра, дескрипторы ожидания или указатели на блоки неуправляемой памяти. Это связано с тем, что сборщик мусора очень эффективно восстанавливает неиспользуемые управляемые объекты, но он не может восстановить неуправляемые объекты.

Если вы не хотите использовать шаблон IDisposable и хотите иметь свой собственный, то я считаю, что это не рекомендуемый способ, поскольку нужно было бы обнаружить, что это может быть очевидно при использовании IDisposable.

Другие вопросы по тегам