шаблон "одиночка" в vb

Я - обычно c# программист, но теперь работаю в VB на этот проект, когда я использую для установки singleton-класса, я следовал бы модели Jon Skeet

public sealed class Singleton
{
    static Singleton instance = null;
    static readonly object padlock = new object();

    Singleton()
    {
    }

    public static Singleton Instance
    {
        get
        {
            lock (padlock)
            {
                if (instance == null)
                {
                    instance = new Singleton();
                }
                return instance;
            }
        }
    }

    //Added to illustrate the point
    public static void a()
    {
    }

    public void b()
    {
    }

} 

или одно из изменений теперь, если я пишу оператор в c#

Singleton.Instance Что процедуры является всеми участниками, которые не статичны, b, но не a.

Теперь, когда я делаю то же в VB

Private Shared _instance As StackTracker
Private Shared ReadOnly _lock As Object = New Object()
Private Sub New()
    _WorkingStack = New Stack(Of MethodObject)
    _HistoryStack = New Queue(Of MethodObject)
End Sub

Public Shared ReadOnly Property Instance() As StackTracker
    Get
        SyncLock _lock
            If (_instance Is Nothing) Then
                _instance = New StackTracker()
            End If
        End SyncLock

        Return _instance
    End Get

End Property

Я добираюсь StackTracker.Instance.Instance и это продолжает идти, в то время как это не конец света, это выглядит плохо.

Вопросом является там путь в VB для сокрытия второго экземпляра, таким образом, пользователь не может рекурсивно назвать Экземпляр?

14
задан Mike 25 February 2019 в 14:08
поделиться

1 ответ

На самом деле это не предложение, выдвинутое Джоном. Вы реализовали третью версию , упомянутую в статье по этому вопросу , которая, как он указывает, не работает в соответствии со спецификацией EMCA из-за отсутствия барьеров памяти.

Скорее, вам следует работать с пятой версией, которая использует вложенный класс и выполняет присвоение экземпляра в объявлении статического поля во вложенном классе.

Если вы работаете в .NET 4.0, вам не нужно ничего этого делать. Вы можете создать статическое поле только для чтения типа Lazy , передав LazyThreadSafetyMode.ExecutionAndPublication в конструктор (вместе с вашим Func , чтобы указать, как для создания экземпляра), чтобы гарантировать, что значение будет создано только один раз.

Затем вы открываете свойство, которое просто вызывает свойство Lazy .Value для возврата значения синглтона с отложенной загрузкой.

5
ответ дан 1 December 2019 в 10:17
поделиться
Другие вопросы по тегам:

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