59 votes

Existe-t-il un avantage à implémenter IDisposable sur des classes qui ne disposent pas de ressources?

En C #, si une classe, telle qu'une classe de gestionnaires, n'a pas de ressources, y a-t-il un avantage à l'avoir : IDisposable ?

Exemple simple:

 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;
 }
}
 

Y aura-t-il un avantage à utiliser la mémoire lors de l'utilisation de BoxManager s'il implémentait également IDisposable? public class BoxManager : IBoxManager , IDisposable

Par exemple:

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

72voto

JaredPar Points 333733

Il y a seulement 2 raisons pour la mise en oeuvre IDisposable sur un type

  • Le type contient des ressources qui doit être libéré quand le type n'est plus utilisé
  • Le type contient des champs de type IDisposable

Si aucune de ces sont vrai, alors ne pas mettre en œuvre IDisposable

MODIFIER

Plusieurs personnes ont mentionné qu' IDisposable est une belle façon de mettre en œuvre début / fin ou terminés de l'exploitation. Alors que ce n'est pas l'intention originale de l' IDisposable il prévoit un très joli motif.

class Operation {
  class Helper : IDisposable {
    internal Operation Operation;
    public void Dispose() {
      Operation.EndOperation();
    }
  }
  public IDisposable BeginOperation() {
    ...
    return new Helper() { Operation = this };
  }
  private void EndOperation() {
    ...
  }
}

Remarque: une Autre façon intéressante de mettre en œuvre ce modèle est lambdas. Au lieu de donner un IDisposable de retour à l'utilisateur en espérant qu'elles n'oubliez pas d'appeler Dispose ont entre eux vous donne un lambda dans lesquelles ils peuvent l'exécution de l'opération et fermer le fonctionnement

public void BeginOperation(Action action) {
  BeginOperationCore();
  try {
    action();
  } finally {
    EndOperation();
  }
}

7voto

Teoman Soygul Points 17544

Il n'y aura pas de différence entre la version jetable et non jetable si vous n'utilisez pas explicitement la méthode Dispose() .

6voto

Andre Loker Points 4336

Alors que votre code ne bénéficieraient pas de la mise en œuvre de IDisposable, je ne peux pas d'accord avec les autres avis ici que l'état IDisposable est uniquement destinée à (directement ou indirectement) de libre-ressources autochtones. IDisposable peut être utilisé chaque fois que l'objet a besoin d'effectuer de nouvelles tâches à la fin de sa vie span. Il est extrêmement utile avec using.

Un très populaire exemple: dans ASP.NET MVC Html.BeginForm renvoie un IDisposable. Sur la création, l'objet s'ouvre la balise, lorsque Disposer est appelé il se ferme. Pas de ressources autochtones concernés, mais encore une bonne utilisation de IDisposable.

5voto

Darin Dimitrov Points 528142

Non, il n'y aura aucun avantage si vous ne faites pas quelque chose d'utile, comme la libération de ressources non managées que votre classe pourrait détenir dans la méthode Dispose .

4voto

Henk Holterman Points 153608

Non, s'il n'y a pas de ressources (gérées ou non gérées), il n'est pas nécessaire d'utiliser IDisposable non plus.

Petite mise en garde: certaines personnes utilisent IDisposable pour nettoyer les gestionnaires d’événements ou les mémoires tampons volumineuses, mais

  • vous ne semblez pas utiliser ces
  • c'est un motif discutable de toute façon.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X