2010-07-23 3 views
12

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

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 illistrate 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 скрыть второй экземпляр, чтобы пользователь не мог рекурсивно вызвать экземпляр?

ответ

4

На самом деле это предложение не выдвинуто Джоном. Вы внедрили third version referenced in the article on the matter, который, по его словам, не работает в соответствии с спецификацией EMCA из-за отсутствия барьеров памяти.

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

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

Затем вы выставляете свойство, которое просто вызывает Lazy<T>.Value property, чтобы вернуть значение одиночного одноразового использования.

+0

он очень похож на вторую версию - простое управление потоками, не использующее 4.0, фактически использующее цель 2.0 с IDE 2008. – Mike

11

Вот полный код:

Public NotInheritable Class MySingleton 
    Private Shared ReadOnly _instance As New Lazy(Of MySingleton)(Function() New 
     MySingleton(), System.Threading.LazyThreadSafetyMode.ExecutionAndPublication) 

    Private Sub New() 
    End Sub 

    Public Shared ReadOnly Property Instance() As MySingleton 
     Get 
      Return _instance.Value 
     End Get 
    End Property 
End Class 

Затем использовать этот класс, получить экземпляр с помощью:

Dim theSingleton As MySingleton = MySingleton.Instance 
+0

Спасибо за [эту статью] (http://www.c-sharpcorner.com/blogs/6854/creating-lazyt-singleton-class.aspx) и [этот инструмент преобразования C# в VB] (http://www.developerfusion.com/tools/convert/csharp-to-vb/). – rundavidrun

+0

Еще можно добраться до объекта MySingleton.Instance.Instance – Mike

3

Оригинальный вопрос был не о том, как реализовать шаблон одноэлементный, но имея в виду тот факт, что в C# это ошибка компилятора, чтобы попытаться получить доступ к статическому члену через экземпляр. В текущем VB это предупреждение.

Решение: Вы можете изменить настройки компилятора проекта «Лечить все предупреждения как ошибки», но я не знаю, какой-либо способ явно лечить только предупреждение 42025 как ошибка.

Это, как говорится, есть и более простой способ реализовать одиночка в VB:

public class Singleton 
    private sub new() 
    end sub 

    public shared readonly property Instance as Singleton 
     get 
      static INST as Singleton = new Singleton 
      return INST 
     end get 
    end property 
end class 

Это зависит от VB потокобезопасных одной инициализации статических переменных, это функция не найден в C#. Строка кода, начинающаяся со слова «статический», оценивается только один раз, даже если свойство экземпляра обращается много раз от многих потоков.

+0

Ссылка на ваше решение VB.Net также размещена [здесь] (https://www.codeproject.com/tips/390465/singleton-pattern-vb-net-using -статическая переменная) Евгения Сухих – DrMarbuse

Смежные вопросы