确保在特定位置调用或设置字典值的优雅方法是什么?


Private Shared Property _dictOfCoinNameNameBasedOnMarketandSymbol As Dictionary(Of String, String)
Get
End Get
Set(value As Dictionary(Of String, String))
End Set
End Property

如果不是字典,通常的方法是将变量转换为属性。然后,可以在set中设置断点并得到。

设置一个字典作为属性会让编译器认为我需要一个set方法来设置字典。我想要一个set方法来设置属性中的项。

我希望能够替换出现次数过多的

_dictOfCoinNameNameBasedOnMarketandSymbol("key") = "value"

放入代码中,我也可以设置断点。我怎么知道?

我想我可以只是创建一个普通的子,并替换所有出现的_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属性,并且永远不能直接访问类中的Dictionary对象(只读或其他)。您还可以在getter中的Return语句之前以及setter中的现有代码行之前或之后添加任何您喜欢的代码。

原始回答:

你想要的是ReadOnly属性。这正是集合在。net框架中暴露的方式,例如Control.ControlsComboBox.ItemsDataSet.TablesDataTable.ColumnsDataTable.Rows等等。在您的例子中,它看起来像这样:

Public Shared ReadOnly Property CoinNamesByMarketAndSymbol As New Dictionary(Of String, String)

我冒昧地给这个属性起了一个合理的名字。注意,这是一个自动属性,也就是说,你不需要显式地指定getter或setter。如果不使用auto-property,等效代码是这样的:

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)

相关内容

最新更新