La compréhension des objets jetables

J'ai regardé dans sur une question comme celle-ci, et même que j'ai trouvé tout à fait un peu, l'un de ceux qui a jeté toute la lumière sur cette affaire pour moi.

Supposons que j'ai ce code:

public class SuperObject : IDisposable
{
    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }

    protected virtual void Dispose(bool disposing) { }
}
  • Faire j'ai besoin de la protected virtual void Dispose(bool) sur SuperObject? Depuis il n'y a vraiment rien à jeter.
public interface ICustom : IDisposable { }
public class Custom : ICustom
{
    public SuperObject Super { get; protected set; }

    public Custom()
    {
        Super = new SuperObject();
    }

    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }

    public virtual void Dispose(bool disposing)
    {
        if (!disposing) return;

        if (Super != null)
            Super.Dispose();
    }
}
public class Foo
{
    public Foo()
    {
        using (var c = new Custom())
        {
            //do magic with c
        }
    }
}

Maintenant ce qui se passe si j'ai envie/besoin d ' /essayer d'utiliser Custom sur une classe comme System.Web.Mvc.Controller qui implémente déjà et a mis en œuvre IDisposable?

public class Moo : Controller
{
    Custom c;

    public Moo()
    {
        c = new Custom();
    }

    //Use c throughout this class        
}

Comment se débarrasser correctement c dans Moo?

Quand il n'y a rien à Jeter, ne pas mettre en œuvre IDisposable.
Pourquoi vous utilisez GC.SuppressFinalize() lorsque vous n'avez pas Finaizer?
c'est une bonne question, peut-être que vous pourriez aider ici: stackoverflow.com/q/19078536/544283.

OriginalL'auteur Esteban | 2013-09-29