2016-08-01 49 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 

在这里,我使用Private Shared _twolettercountryCodeDict As Generic.Dictionary(Of String, String)如何限制一个共享变量的范围,以便它只能在一个函数中访问?

那是因为我想分享的是_twolettercountryCodeDict整个程序。我基本上实现延迟加载。我不希望读取文本文件和填充国家代码的部分代码重复执行。

问题是如果我将它声明为Private Shared,则同一类中的其他方法也可以访问该变量。这不是什么大问题,但说我想避免它。

如果我在函数内声明变量为static,那么不会共享twolettercountryCodeDict。

所以我现在处于两难的境地。什么是解决方案?

我们只是说,twolettercountrycode需要一个私人成员,所以它不能是一个共享函数。但我想_twolettercountryCodeDict只能从两个国家/地区代码共享和访问。我可以这样做吗?

+0

声明一个只读私有共享属性,该属性返回在该函数中设置的私有变量的值。 – Tibrogargan

+0

这是完美的解决方案。 –

回答

1

这不正是你所要求的,但它解决了只允许一次完成资源加载的要求。您可以通过在仅用于加载资源的类上使用Shared Constructor来实现同样的目的。

您可能还想使用ReadOnlyDictionaryimplementation),以便您的字典无法由调用者修改。

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 
相关问题