Предполагается, что 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;
}