Padrão C # Singleton com inicialização acionável

Eu preciso de um singleton que:

is preguiçoso carregadois thread safe carrega alguns valores na construção esses valores podem ser consultados a qualquer momento a inicialização PODE acontecer em algum momento preciso, antes do início da consulta - por isso devo ser capaz de acioná-la de fora de alguma forma. Obviamente, acionar várias vezes deve fazer a inicialização apenas uma ve

Eu uso o .NET 3.5.

Comecei com o Jon Skeetimplementaçã (5ª versão) usando uma subclasse estática:

public sealed class Singleton
{
    IEnumerable<string> Values {get; private set;}
    private Singleton()
    {
        Values = new[]{"quick", "brown", "fox"};
    }

    public static Singleton Instance { get { return Nested.instance; } }

    private class Nested
    {
        // Explicit static constructor to tell C# compiler
        // not to mark type as beforefieldinit
        static Nested()
        {
        }

        internal static readonly Singleton instance = new Singleton();
    }
} 

Isso marca quase todas as caixas, exceto a "inicialização do gatilho de fora". Como a inicialização real ocorre dentro do ctor, não pode ocorrer mais de uma ve

Como pode ser isto alcançado

O singleton será usado assim:

public static void Main(){

    //do stuff, singleton should not yet be initialized.

    //the time comes to initialize the singleton, e.g. a database connection is available
    //this may be called 0 or more times, possibly on different threads

    Singleton.Initialize();
    Singleton.Initialize();
    Singleton.Initialize();

    //actual call to get retrieved values, should work
    var retrieveVals = Singleton.Instance.Values;

}

questionAnswers(6)

yourAnswerToTheQuestion