Первая идея, которая у меня возникла, состояла в том, чтобы просто использовать одноразовую переменную, назначенную экземпляру синглтона, которая (вероятно?) Вызовет инициализацию
static Main()
{
var unused = Singleton.Instance;
//this should initialize the singleton, unless the compiler optimizes it out.
//I wonder if the compiler is smart enough to see this call has side effects.
var vals = Singleton.Instance.Values;
}
... но программирование побочными эффектами - это нечтоЯ изо всех сил стараюсь избегать, поэтому давайте немного проясним намерение.
public class Singleton {
public static void Initialize() {
//this accesses the static field of the inner class which triggers the private Singleton() ctor.
Instance._Initialize();
}
private void _Initialize()
{ //do nothing
}
[the rest as before]
}
, поэтому использование будет:
static Main()
{
//still wondering if the compiler might optimize this call out
Singleton.Initialize();
var vals = Singleton.Instance.Values;
}
Кстати, это также сработает:
static Main()
{
var vals = Singleton.Instance.Values;
}
За исключением оптимизации компилятора, я думаю, что это отвечает всем требованиям.