2016-10-31 5 views
1

So, wie das ist, würde ich meine faule Klasse entwerfen (Von this SO):Kann ich den Zugang meiner faulen Klasse ohne Nachteil verkürzen

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 

den _MyString Wert zuzugreifen, ich folgendes:

Dim MyString = MySingleton.Instance.MyString 

In der Tat muss ich immer die ".Instance." Hat es benachteiligt, wenn ich die Eigenschaft, die folgende Art und Weise gestalten: „.Instance“

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

So kann ich darauf zugreifen, ohne immer das Schreiben

Dim MyString = MySingleton.MyString 

Antwort

1

Ja, Sie können (natürlich mit Public Shared Property), aber Sie sind nur einige der Vorteile von Singleton über statische Klassen zu verlieren.

Können sagen, Sie eine andere Klasse haben MyWorker

Public Class MyWorker 

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

End Class 

ich das nicht tun würde. Das sieht vielleicht nicht nach einem großen Problem aus, aber auf lange Sicht haben Sie eine enge Kopplung in Ihrer Code-Basis und eine harte Zeit verspotten Ihre Klasse für Komponententests, einer der Gründe für die Verwendung von Singeltons über statische Klassen an erster Stelle.

benutze ich oft diesen Ansatz, beim Zugriff auf Singelton mutiple mal Werte:

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

viel sauberer Ansatz.

Verwandte Themen