web-dev-qa-db-fra.com

Comment et quand les membres statiques c # sont-ils disposés?

J'ai une classe avec de nombreux membres statiques, dont certains gardent des références à des objets gérés et non gérés.

Par exemple, le constructeur statique est appelé dès que le type est référencé, ce qui oblige ma classe à générer une file d'attente blockingQueue. Cela se produit lorsque l'une des méthodes statiques est appelée, par exemple.

J'ai implémenté IDisposable, ce qui me donne des méthodes pour gérer l'élimination de tous les objets d'instance que j'ai créés. Cependant, ces méthodes ne sont jamais appelées si le consommateur ne crée aucun objet d'instance à partir de ma classe.

Comment et où puis-je mettre du code pour éliminer les références gérées par la partie statique de ma classe? J'ai toujours pensé que l'élimination des ressources référencées statiquement avait lieu lors de la publication du dernier objet d'instance; c'est la première fois que je crée une classe où aucune instance ne peut jamais être créée.

27
Joe

Les variables statiques de votre classe ne sont pas récupérées jusqu'à ce que le domaine d'applications hébergeant votre classe soit déchargé. La méthode Dispose() ne sera pas appelée car il s'agit d'une méthode d'instance et vous avez dit que vous ne créeriez aucune instance de votre classe.

Si vous souhaitez utiliser la méthode Dispose(), définissez votre objet comme un singleton, créez-en une instance et supprimez-le explicitement lorsque votre application est sur le point de quitter.

public class MyClass : IDisposable {
    public IList List1<int> {get; private set;}
    public IDictionary<string,string> Dict1 {get; private set;}
    public void Dispose() {
        // Do something here
    }
    public static MyClass Instance {get; private set;}
    static MyClass() {
        Instance = new MyClass();
    }
    public static void DisposeInstance() {
        if (instance != null) {
            Instance.Dispose();
            Instance = null;
        }
    }
}
44
dasblinkenlight
public class Logger : IDisposable
{

    private string _logDirectory = null;
    private static Logger _instance = null;

    private Logger() : this(ConfigurationManager.AppSettings["LogDirectory"])
    {
        AppDomain.CurrentDomain.ProcessExit += CurrentDomain_ProcessExit;
    }

    private Logger(string logDirectory) 
    {
    } 

    public static Logger Instance
    {
        get
        {
            if (_instance == null)
                _instance = new Logger();
            return _instance;
        }
    }

    private void CurrentDomain_ProcessExit(object sender, EventArgs e)
    {
        Dispose();
    }



    public void Dispose()
    {
        // Dispose unmanaged resources
    }
}
0
Guido Kleijer

Vous devez disposer ces objets manuellement, il n’existe aucun moyen de créer un "finaliseur" pour les ressources statiques.

0
oxilumin