2016-08-01 5 views
0
Private Shared _twolettercountryCodeDict As Generic.Dictionary(Of String, String) 
Private Function twolettercountrycode() As String 


    If _twolettercountryCodeDict Is Nothing Then 
     _twolettercountryCodeDict = New Generic.Dictionary(Of String, String) From {{"ty", "turkey"}, {"py", "pakinmay"}, {"ra", "romania"}, {"vm", "vietnam"}, {"bl", "brazil"}, {"et", "egypt"}, {"ka", "korea"}} 
     Dim listOfCountries = fileToCol(COUNTRYCODESFileName) 

     For Each var In listOfCountries 
      Dim ar = var.Split({"*"}, System.StringSplitOptions.None).ToList() 
      _twolettercountryCodeDict.Add(LCase(ar(1)), UCase(ar(0))) 
     Next 
    End If 

    Return _twolettercountryCodeDict(Me.twoletter.ToLower) 
End Function 

Hier bin ich mit Private Shared _twolettercountryCodeDict As Generic.Dictionary(Of String, String)Wie kann der Gültigkeitsbereich einer freigegebenen Variablen eingeschränkt werden, so dass nur auf eine Funktion zugegriffen werden kann?

Das ist, weil ich das _twolettercountryCodeDict für das gesamte Programm gemeinsam nutzen möchten. Ich implementiere im Grunde Lazy Loading. Ich will nicht, dass ein Teil des Codes, der eine Textdatei liest und Ländercodes auffüllt, immer wieder gemacht wird.

Die Sache ist, wenn ich es als Private Shared deklariere, können andere Methoden in der gleichen Klasse auch auf diese Variable zugreifen. Das ist kein großes Problem, aber ich will es vermeiden.

Wenn ich die Variable innerhalb der Funktion als statisch deklariere, wird das twolettercountryCodeDict nicht freigegeben.

So bin ich in einem Dilemma. Was ist die Lösung?

Sagen wir einfach, dass twolettercountrycode ein privates Mitglied erfordert, also kann es keine geteilte Funktion sein. Aber ich möchte, dass _twolettercountryCodeDict nur vom Twolettercountrycode geteilt und zugänglich ist. Kann ich das tun?

+0

Deklarieren Sie eine schreibgeschützte Private Shared-Eigenschaft, die den Wert einer Private-Variable zurückgibt, die Sie in der Funktion festlegen. – Tibrogargan

+0

Das ist die perfekte Lösung. –

Antwort

1

Dies erfüllt nicht genau das, wonach Sie gefragt haben, aber es löst die Anforderung, dass das Laden der Ressourcen nur einmal durchgeführt werden darf. Sie können dasselbe erreichen, indem Sie eine Shared Constructor für eine Klasse verwenden, die nur zum Laden Ihrer Ressource dient.

Sie können auch ein ReadOnlyDictionary (implementation) verwenden, damit Ihr Wörterbuch nicht von Anrufern geändert werden kann.

Friend Shared ReadOnly Property twolettercountrycode As Generic.Dictionary 
    Get 
     Static _twolettercountryCodeDict As Generic.Dictionary = Nothing 
     If _twolettercountryCodeDict Is Nothing Then 
      _twolettercountryCodeDict = New Generic.Dictionary(Of String, String) From {{"ty", "turkey"}, {"py", "pakinmay"}, {"ra", "romania"}, {"vm", "vietnam"}, {"bl", "brazil"}, {"et", "egypt"}, {"ka", "korea"}} 
      Dim listOfCountries = fileToCol(COUNTRYCODESFileName) 

      For Each var In listOfCountries 
       Dim ar = var.Split({"*"}, System.StringSplitOptions.None).ToList() 
       _twolettercountryCodeDict.Add(LCase(ar(1)), UCase(ar(0))) 
      Next 
     End If 
     return _twolettercountryCodeDict 
    End Get 
End Property 
Verwandte Themen