确保在特定位置调用或设置字典值的优雅方法是什么?
What's the elegant way to make sure that values of dictionary are called or set in a specific location?
Private Shared Property _dictOfCoinNameNameBasedOnMarketandSymbol As Dictionary(Of String, String)
Get
End Get
Set(value As Dictionary(Of String, String))
End Set
End Property
通常的方法,如果不是字典,就是把变量变成属性。然后我们可以在set和get中打断点。
问题是将字典设置为 属性 会使编译器认为我需要一个 set 方法来设置字典。我想要一个设置方法来设置 属性.
中的项目
我希望能够替换
的传播事件
_dictOfCoinNameNameBasedOnMarketandSymbol("key") = "value"
进入代码我也可以设置断点。我该怎么办?
我想我可以创建一个普通的 sub 并将所有出现的 _dictOfCoinNameNameBasedOnMarketandSymbol("key") = "value" 替换为 AssignCoinNameNameBasedOnMarketandSymbolWithKeyValue("key","value")
我写了
Function GetCoinNameNameBasedOnMarketandSymbol(key As String) As String
Return _dictOfCoinNameNameBasedOnMarketandSymbol(key)
End Function
Sub AssignCoinNameNameBasedOnMarketandSymbol(key As String, coinname As String)
_dictOfCoinNameNameBasedOnMarketandSymbol(key) = coinname
End Sub
然后我将手动出现所有其他 _dictOfCoinNameNameBasedOnMarketandSymbol
。如果我看到 _dictOfCoinNameNameBasedOnMarketandSymbol
被分配了错误的值,我可以在 AssignCoinNameNameBasedOnMarketandSymbol
中放置断点。
这种技术的问题在于无论如何都无法自动执行它。我只需要检查代码并一个一个地替换它。
还有更优雅的方式吗?
如果 _dictOfCoinNameNameBasedOnMarketandSymbol
不是字典,则使用适当的 get 和 set 值将其更改为 属性 就可以了。我什至不需要改变任何东西。
我想我最初可能误解了这个问题。为了完整起见,我将在下面留下我原来的答案,但我会根据我的新理解在这里回答。
在我看来,您真正需要的是一个索引 属性,它将包裹 Dictionary
,例如
Public Class SomeClass
Private Shared ReadOnly valuesByKey As New Dictionary(Of String, String)
Public Shared Property ValueByKey(key As String) As String
Get
Return valuesByKey(key)
End Get
Set
valuesByKey(key) = Value
End Set
End Property
End Class
您现在可以只获取和设置 ValueByKey
属性 而永远不会直接访问 - 只读或其他方式 - class 中的 Dictionary
对象.您还可以在 getter 中的 Return
语句之前以及 setter.
中现有代码行之前或之后添加您喜欢的任何代码
原始答案:
你要的是ReadOnly
属性。这正是集合在整个 .NET Framework 中的公开方式,例如Control.Controls
、ComboBox.Items
、DataSet.Tables
、DataTable.Columns
、DataTable.Rows
等。在您的情况下,它看起来像这样:
Public Shared ReadOnly Property CoinNamesByMarketAndSymbol As New Dictionary(Of String, String)
我冒昧地给 属性 起了一个合理的名字。请注意,这是一个自动 属性,即您没有明确指定 getter 或 setter。不使用 auto-属性,等效代码为:
Private Shared _coinNamesByMarketAndSymbol As New Dictionary(Of String, String)
Public Shared ReadOnly Property CoinNamesByMarketAndSymbol As Dictionary(Of String, String)
Get
Return _coinNamesByMarketAndSymbol
End Get
End Property
请注意,我已声明此 属性 Public
。我注意到您已声明它 Private
但这似乎没有什么意义。这样的 属性 有什么用?如果它只能在内部访问,那你为什么不直接使用字段?
使用上面的代码,您现在可以从 属性 中获取 Dictionary
来获取、添加或删除项目,但您不能替换整个 Dictionary
,即您可以这个:
Dim coinName = SomeClass.CoinNamesByMarketAndSymbol(marketAndSymbol)
SomeClass.CoinNamesByMarketAndSymbol.Add(marketAndSymbol, coinName)
SomeClass.CoinNamesByMarketAndSymbol.Remove(marketAndSymbol)
但是你不能这样做:
SomeClass.CoinNamesByMarketAndSymbol = New Dictionary(Of String, String)
Private Shared Property _dictOfCoinNameNameBasedOnMarketandSymbol As Dictionary(Of String, String)
Get
End Get
Set(value As Dictionary(Of String, String))
End Set
End Property
通常的方法,如果不是字典,就是把变量变成属性。然后我们可以在set和get中打断点。
问题是将字典设置为 属性 会使编译器认为我需要一个 set 方法来设置字典。我想要一个设置方法来设置 属性.
中的项目我希望能够替换
的传播事件 _dictOfCoinNameNameBasedOnMarketandSymbol("key") = "value"
进入代码我也可以设置断点。我该怎么办?
我想我可以创建一个普通的 sub 并将所有出现的 _dictOfCoinNameNameBasedOnMarketandSymbol("key") = "value" 替换为 AssignCoinNameNameBasedOnMarketandSymbolWithKeyValue("key","value")
我写了
Function GetCoinNameNameBasedOnMarketandSymbol(key As String) As String
Return _dictOfCoinNameNameBasedOnMarketandSymbol(key)
End Function
Sub AssignCoinNameNameBasedOnMarketandSymbol(key As String, coinname As String)
_dictOfCoinNameNameBasedOnMarketandSymbol(key) = coinname
End Sub
然后我将手动出现所有其他 _dictOfCoinNameNameBasedOnMarketandSymbol
。如果我看到 _dictOfCoinNameNameBasedOnMarketandSymbol
被分配了错误的值,我可以在 AssignCoinNameNameBasedOnMarketandSymbol
中放置断点。
这种技术的问题在于无论如何都无法自动执行它。我只需要检查代码并一个一个地替换它。
还有更优雅的方式吗?
如果 _dictOfCoinNameNameBasedOnMarketandSymbol
不是字典,则使用适当的 get 和 set 值将其更改为 属性 就可以了。我什至不需要改变任何东西。
我想我最初可能误解了这个问题。为了完整起见,我将在下面留下我原来的答案,但我会根据我的新理解在这里回答。
在我看来,您真正需要的是一个索引 属性,它将包裹 Dictionary
,例如
Public Class SomeClass
Private Shared ReadOnly valuesByKey As New Dictionary(Of String, String)
Public Shared Property ValueByKey(key As String) As String
Get
Return valuesByKey(key)
End Get
Set
valuesByKey(key) = Value
End Set
End Property
End Class
您现在可以只获取和设置 ValueByKey
属性 而永远不会直接访问 - 只读或其他方式 - class 中的 Dictionary
对象.您还可以在 getter 中的 Return
语句之前以及 setter.
原始答案:
你要的是ReadOnly
属性。这正是集合在整个 .NET Framework 中的公开方式,例如Control.Controls
、ComboBox.Items
、DataSet.Tables
、DataTable.Columns
、DataTable.Rows
等。在您的情况下,它看起来像这样:
Public Shared ReadOnly Property CoinNamesByMarketAndSymbol As New Dictionary(Of String, String)
我冒昧地给 属性 起了一个合理的名字。请注意,这是一个自动 属性,即您没有明确指定 getter 或 setter。不使用 auto-属性,等效代码为:
Private Shared _coinNamesByMarketAndSymbol As New Dictionary(Of String, String)
Public Shared ReadOnly Property CoinNamesByMarketAndSymbol As Dictionary(Of String, String)
Get
Return _coinNamesByMarketAndSymbol
End Get
End Property
请注意,我已声明此 属性 Public
。我注意到您已声明它 Private
但这似乎没有什么意义。这样的 属性 有什么用?如果它只能在内部访问,那你为什么不直接使用字段?
使用上面的代码,您现在可以从 属性 中获取 Dictionary
来获取、添加或删除项目,但您不能替换整个 Dictionary
,即您可以这个:
Dim coinName = SomeClass.CoinNamesByMarketAndSymbol(marketAndSymbol)
SomeClass.CoinNamesByMarketAndSymbol.Add(marketAndSymbol, coinName)
SomeClass.CoinNamesByMarketAndSymbol.Remove(marketAndSymbol)
但是你不能这样做:
SomeClass.CoinNamesByMarketAndSymbol = New Dictionary(Of String, String)