');

C# Language Smaltimento dell'istanza Singleton quando non è più necessaria

Esempio

La maggior parte degli esempi mostra la LazySingleton istanze e il possesso di un oggetto LazySingleton fino a quando l'applicazione proprietaria non è terminata, anche se tale oggetto non è più necessario dall'applicazione. Una soluzione è implementare IDisposable e impostare l'istanza dell'oggetto su null come segue:

public class LazySingleton : IDisposable
{
    private static volatile Lazy<LazySingleton> _instance;
    private static volatile int _instanceCount = 0;
    private bool _alreadyDisposed = false;

public static LazySingleton Instance
{
    get
    {
        if (_instance == null)
            _instance = new Lazy<LazySingleton>(() => new LazySingleton());
        _instanceCount++;
        return _instance.Value;
    }
}

private LazySingleton() { }

// Public implementation of Dispose pattern callable by consumers.
public void Dispose()
{ 
    if (--_instanceCount == 0) // No more references to this object.
    {       
       Dispose(true);
       GC.SuppressFinalize(this);           
    }
}

// Protected implementation of Dispose pattern.
protected virtual void Dispose(bool disposing)
{
    if (_alreadyDisposed) return; 
  
    if (disposing) 
    {
        _instance = null; // Allow GC to dispose of this instance.
        // Free any other managed objects here.
    }
  
    // Free any unmanaged objects here.
    _alreadyDisposed = true;
}

Il codice precedente elimina l'istanza prima della chiusura dell'applicazione, ma solo se i consumatori chiamano Dispose() sull'oggetto dopo ogni utilizzo. Poiché non vi è alcuna garanzia che ciò accada o un modo per forzarlo, non vi è alcuna garanzia che l'istanza sarà mai smaltita. Ma se questa classe viene utilizzata internamente, è più facile assicurarsi che il metodo Dispose() venga chiamato dopo ogni utilizzo. Segue un esempio:

public class Program
{
    public static void Main()
    {
        using (var instance = LazySingleton.Instance)
        {
            // Do work with instance
        }
    }
}

Si prega di notare che questo esempio non è thread-safe .