protected DisposableSingleton()
 {
     lock (typeof(T))
     {
         if (s_singleton != null)
         {
             throw new InvalidOperationException("Already instanciated somewhere and/or not properly disposed");
         }
         s_singleton = this;
     }
 }
        private bool disposedValue = false; // Pour détecter les appels redondants

        protected virtual void Dispose(bool disposing)
        {
            if (!disposedValue)
            {
                if (disposing)
                {
                    lock (typeof(T))
                    {
                        s_singleton = null;
                    }
                }

                // TODO: libérer les ressources non managées (objets non managés) et remplacer un finaliseur ci-dessous.
                // TODO: définir les champs de grande taille avec la valeur Null.

                disposedValue = true;
            }
        }