Я - обычно 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 для сокрытия второго экземпляра, таким образом, пользователь не может рекурсивно назвать Экземпляр?
На самом деле это не предложение, выдвинутое Джоном. Вы реализовали третью версию , упомянутую в статье по этому вопросу , которая, как он указывает, не работает в соответствии со спецификацией EMCA из-за отсутствия барьеров памяти.
Скорее, вам следует работать с пятой версией, которая использует вложенный класс и выполняет присвоение экземпляра в объявлении статического поля во вложенном классе.
Если вы работаете в .NET 4.0, вам не нужно ничего этого делать. Вы можете создать статическое поле только для чтения типа Lazy
, передав LazyThreadSafetyMode.ExecutionAndPublication
в конструктор (вместе с вашим Func
, чтобы указать, как для создания экземпляра), чтобы гарантировать, что значение будет создано только один раз.
Затем вы открываете свойство, которое просто вызывает свойство Lazy
для возврата значения синглтона с отложенной загрузкой.