public sealed class Singleton { Singleton() {} public static Singleton Instance { get { return Nested.instance; } } class Nested { // Explicit static constructor to tell C# compiler // not to mark type as beforefieldinit static Nested() {} internal static readonly Singleton instance = new Singleton(); } }
Я хочу реализовать Шаблон "одиночка" Jon Skeet в своем текущем приложении в C#.
У меня есть два сомнения на коде
Как возможно получить доступ к внешнему классу во вложенном классе? Я имею в виду
internal static readonly Singleton instance = new Singleton();
Что-то называют закрытием?
Я не могу понять этот комментарий
// Explicit static constructor to tell C# compiler // not to mark type as beforefieldinit
что этот комментарий предлагает нас?
Нет, это не имеет ничего общего с замыканиями. Вложенный класс имеет доступ к закрытым членам своего внешнего класса, включая закрытый конструктор.
Прочтите мою статью о beforefieldinit . Вы можете захотеть или не захотеть статический конструктор no-op - это зависит от того, какие гарантии лени вам нужны. Вы должны знать, что .NET 4 несколько изменяет фактическую семантику инициализации типа (все еще в пределах спецификации, но более ленивую, чем раньше).
А вам действительно нужен этот узор? Вы уверены, что вам не сойдет с рук:
public sealed class Singleton
{
private static readonly Singleton instance = new Singleton();
public static Singleton Instance { get { return instance; } }
static Singleton() {}
private Singleton() {}
}