Есть ли какая-то польза от реализации IDisposable на классах, которые не имеют ресурсов? - PullRequest
59 голосов
/ 28 февраля 2012

В C #, если у класса, такого как класс менеджера, нет ресурсов, есть ли какое-то преимущество в его наличии : IDisposable?

Простой пример:

public interface IBoxManager
{
 int addBox(Box b);
}

public class BoxManager : IBoxManager
{
 public int addBox(Box b)
 {
  using(dataContext db = new dataContext()){
   db.Boxes.add(b);
   db.SaveChanges();
  }
  return b.id;
 }
}

Будет ли какая-либо польза от использования памяти при использовании BoxManager, если он также реализует IDisposable?public class BoxManager : IBoxManager , IDisposable

Например:

BoxManager bm = new BoxManager();
bm.add(myBox);
bm.dispose();//is there benefit to doing this?

Ответы [ 11 ]

0 голосов
/ 06 ноября 2012

Там еще одна причина, по которой никто не упомянул (хотя это debateful, если это действительно стоит): Соглашение говорит, что если кто-то использует класс, который реализует IDisposable, он должен вызвать свой метод Dispose (либо явно, либо с помощью оператора 'using'). Но что произойдет, если V1 класса (в вашем публичном API) не нужно IDisposable, а V2 делает? Технически это не нарушает обратную совместимость, чтобы добавить интерфейс к классу, но из-за этого соглашение , это так! Потому что старые клиенты вашего кода не будут вызывать его метод Dispose и могут привести к тому, что ресурсы не будут освобождены. (Почти) единственный способ избежать этого - внедрить IDisposable в любом случае, если вы подозреваете, что он понадобится вам в будущем, чтобы ваши клиенты всегда вызывали ваш метод Dispose, что когда-нибудь может действительно понадобиться. Другой (и, вероятно, лучший) способ заключается в реализации лямбда-паттерна, упомянутого JaredPar выше в V2 API.

...