c# - usar - qué son los métodos estáticos
¿Cómo y cuándo se eliminan los miembros estáticos c#? (3)
Tengo una clase con miembros estáticos extensos, algunos de los cuales mantienen referencias a objetos administrados y no administrados.
Por ejemplo, se llama al constructor estático tan pronto como se hace referencia al Tipo, lo que hace que mi clase gire un bloqueo de las tareas. Esto sucede cuando se llama a uno de los métodos estáticos, por ejemplo.
Implementé IDisposable, que me brinda métodos para manejar la eliminación de los objetos de instancia que creé. Sin embargo, nunca se llama a estos métodos si el consumidor no crea ningún objeto de instancia de mi clase.
¿Cómo y dónde pongo el código para eliminar las referencias mantenidas por la parte estática de mi clase? Siempre pensé que la eliminación de los recursos de referencia estática ocurría cuando se liberaba el último objeto de instancia; esta es la primera vez que he creado una clase en la que nunca se pueden crear instancias.
Debe desechar estos objetos manualmente, no hay forma de crear un "finalizador" para los recursos estáticos.
La variable estática de su clase no se recopila como basura hasta que se descarga el dominio de la aplicación que aloja su clase. No se llamará al método Dispose()
, porque es un método de instancia, y usted dijo que no crearía ninguna instancia de su clase.
Si desea utilizar el método Dispose()
, convierta su objeto en un singleton, cree una instancia de él y elimínelo explícitamente cuando su aplicación esté a punto de salir.
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;
}
}
}
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
}
}