Singleton разъяснением Jon Skeet

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#.

У меня есть два сомнения на коде

  1. Как возможно получить доступ к внешнему классу во вложенном классе? Я имею в виду

    internal static readonly Singleton instance = new Singleton();
    

    Что-то называют закрытием?

  2. Я не могу понять этот комментарий

    // Explicit static constructor to tell C# compiler
    // not to mark type as beforefieldinit
    

    что этот комментарий предлагает нас?

212
задан Charith 11 March 2018 в 02:41
поделиться

1 ответ

  1. Нет, это не имеет ничего общего с замыканиями. Вложенный класс имеет доступ к закрытым членам своего внешнего класса, включая закрытый конструктор.

  2. Прочтите мою статью о 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() {}
}
356
ответ дан 23 November 2019 в 04:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: