Предполагается, что Initialize запускает ctor синглтона - один раз.

ужен синглтон, который:

лениво загруженпотокобезопасензагружает некоторые значения при строительствеэти значения могут быть запрошены в любое времяинициализация МОЖЕТ произойти в какое-то точное время, до того, как начнутся запросы - поэтому я должен иметь возможность вызывать его извне. Конечно, запуск несколько раз должен выполнить инициализацию только один раз.

Я использую .NET 3.5.

Я начал с Джона Скитареализация (5-я версия) с использованием статического подкласса:

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();
    }
} 

Это помечает почти все поля, кроме «инициализации триггера извне». Поскольку фактическая инициализация происходит внутри ctor, это не может произойти более одного раза.

Как это можно сделать?

Синглтон будет использоваться так:

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;

}