Нет способа сделать это во время компиляции, потому что это все равно, что спросить компилятор: «Можете ли вы доказать, что код X никогда не выполняется до выполнения кода Y в присутствии нескольких потоков?».Это невозможно сделать.
Что касается поведения вашего проекта во время выполнения, я думаю, что это настолько хорошо, насколько это когда-либо возможно.
Вы можете сделать его немного лучше, выставив Func<SingletonType>
собственность в вашем классе синглтон.Когда кто-то запрашивает экземпляр синглтона, а экземпляр еще не создан, ваш класс вызывает этот «фабричный метод» для создания синглтона.Если фабричный метод - null
, то вы либо генерируете исключение, либо (если применимо) конструкцию, используя некоторые параметры по умолчанию.
То, что это делает, по существу откладывает построение синглтона до тех пор, пока оно фактически не потребуется для первоговремя, так что это некоторое улучшение.Но основной принцип тот же.
Обновление:
Как указывает LukeH
, это в значительной степени то, что делает Lazy<T>
(только .NET 4),Если возможно, используйте его вместо того, чтобы писать свой.