我有四个属性需要返回数组,字典和列表,如CA1819所述,不应该这样做。它还指出,返回的阵列副本具有很大的性能影响,这是可以理解的。因此,为了解决这个问题,我将返回的值转换为IReadOnlyList等,但我不确定这会如何影响性能。
以下是前三个属性:
Public Property ScheduledDates As List(Of Date)
Get
Return CType(ws_ScheduledDates, IReadOnlyList(Of Date))
End Get
Set(value As List(Of Date))
ws_ScheduledDates = value
End Set
End Property
Public Property ExcludedDates As List(Of Date)
Get
Return CType(ws_ExcludedDates, IReadOnlyList(Of Date))
End Get
Set(value As List(Of Date))
ws_ExcludedDates = value
End Set
End Property
Public Property RecurringDaysOfMonth As Boolean()
Get
Return CType(ws_RecurringDaysOfMonth, IReadOnlyList(Of Boolean))
End Get
Set(value As Boolean())
ws_RecurringDaysOfMonth = value
End Set
End Property
这是解决CA1819中概述的问题的可接受方式吗?它会对性能产生什么影响?
我的第四个属性需要返回嵌套字典:
Public Property RecurringWeekDays As Dictionary(Of String, Dictionary(Of String, Boolean))
Get
Return CType(ws_RecurringWeekDays, IReadOnlyDictionary(Of String, Dictionary(Of String, Boolean)))
End Get
Set(ByVal value As Dictionary(Of String, Dictionary(Of String, Boolean)))
ws_RecurringWeekDays = value
End Set
End Property
'Example
'New Dictionary(Of String, Dictionary(Of String, Boolean)) From {
'{"Monday", New Dictionary(Of String, Boolean) From
' {
' {"First", False},
' {"Second", False},
' {"Third", False},
' {"Fourth", False},
' {"Last", False}
' }
' },
' {"Tuesday", New Dictionary(Of String, Boolean) From
' {
' And so on...
在这种情况下,嵌套的Dictionaries不会强制转换为IReadOnlyDictionary。那么这是否意味着它们仍然是可变的?或不是因为他们的父母是不可变的?
提前致谢
答案 0 :(得分:0)
回答第一部分:
是的,这是解决CA1819违规的有效方法。 documentation for CA1819提及"更改属性以返回集合"作为有效的解决方案。
至于集合与阵列的性能影响,我认为您会发现对于大多数应用程序而言,差异可以忽略不计。需要使用真实的数据样本进行实际测试,以便对此进行适当的测量,但是您可能会获得很大的影响。
但是,如果性能差异对于您的特定应用程序来说很重要,那么对于reasons listed here,将属性更改为方法可能是一个好主意。 (在以下情况中查找" 使用方法而不是属性"部分。)
回答第二部分:
我不确定只是从查看代码,但如果您有任何疑问,应该相当容易自己验证。
好的,所以这第二部分更像是一个"建议"而不是"答案" ...也许别人会马上知道...