我可以缩短我的Lazy类的访问权限而不会有缺点

时间:2016-10-31 11:53:42

标签: vb.net

所以这就是我设计我的Lazy类的方法(来自this SO):

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

    Private _MyString As String
    Public Property MyString As String
        Get
            Return _MyString
        End Get
        Set(value As String)
            _MyString = value
        End Set
    End Property

End Class

要访问_MyString值,请执行以下操作:

Dim MyString = MySingleton.Instance.MyString

事实上,我总是要键入“.Instance”。 如果我按以下方式设计属性,它是否有任何不利之处:

Public Property MyString As String
    Get
        Return instance._MyString
    End Get
    Set(value As String)
        instance._MyString = value
    End Set
End Property

所以我可以在不写“.Instance。”的情况下访问它。

Dim MyString = MySingleton.MyString

1 个答案:

答案 0 :(得分:1)

是的,您可以(当然使用Public Shared Property),但是您正在失去单例而非静态类的一些好处。

假设你有另一个班级MyWorker

Public Class MyWorker

    Public Sub Work(instance as MySingleton)
       Dim value as String = instance.MyString
       ' Do something ...
    End Sub

End Class

我不会这样做。这可能看起来不是一个大问题,但从长远来看,你的代码库中存在紧密耦合,并且很难模拟你的类进行单元测试,这是首先在静态类上使用singeltons的原因之一。 / p>

在多次访问Singelton值时,我经常使用这种方法:

Dim instance as MySingelton = MySingelton.Value
If instance.MyString = "something" Then
    instance.MyString = "something else"
End If

更干净的方法。