返回数组和嵌套字典的属性 - CA1819

时间:2014-10-11 14:58:29

标签: arrays vb.net properties

我有四个属性需要返回数组,字典和列表,如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。那么这是否意味着它们仍然是可变的?或不是因为他们的父母是不可变的?

提前致谢

1 个答案:

答案 0 :(得分:0)

回答第一部分:

是的,这是解决CA1819违规的有效方法。 documentation for CA1819提及"更改属性以返回集合"作为有效的解决方案。

至于集合与阵列的性能影响,我认为您会发现对于大多数应用程序而言,差异可以忽略不计。需要使用真实的数据样本进行实际测试,以便对此进行适当的测量,但是您可能会获得很大的影响。

但是,如果性能差异对于您的特定应用程序来说很重要,那么对于reasons listed here,将属性更改为方法可能是一个好主意。 (在以下情况中查找" 使用方法而不是属性"部分。)

回答第二部分:

我不确定只是从查看代码,但如果您有任何疑问,应该相当容易自己验证。

好的,所以这第二部分更像是一个"建议"而不是"答案" ...也许别人会马上知道...