2014-10-11 23 views
0

我有需要返回其爲CA1819狀態,不應該做的陣列,字典和列表四個屬性。它還指出返回陣列的副本具有很大的性能影響。所以要嘗試解決這個問題,我將返回的值轉換爲IReadOnlyList等,但我不確定這會如何影響性能。屬性返回數組和嵌套的字典 - CA1819

這裏是前三個屬性:

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... 

在這種情況下,嵌套的字典都無法投射到IReadOnlyDictionary。那麼這是否意味着它們仍然是可變的?還是不是因爲他們的父母是不可變的?

在此先感謝

回答

0

要回答第一部分:

是的,這是要解決的CA1819侵害的有效方法。 documentation for CA1819提到「更改屬性返回集合」作爲有效的修復。

至於集合與數組對性能的影響,我想你會發現,對於大多數應用,不同的是可以忽略不計。這將需要通過實際的測試以及現實的數據樣本來給你一個適當的測量,但是你不會看到太大的影響。

但是,如果性能差異對於您的特定應用程序證明有意義,那麼將屬性更改爲方法可能是一個好主意,對於reasons listed here。 (查找「一定要使用的方法,而不是一個性質,在下列情況下」一節)。

要回答的第二部分:從剛纔看

我真的不知道在代碼中,但如果您有任何疑問,應該相當容易地自行驗證此問題。

好的,所以這第二部分是比「回答」更多的「建議」......也許別人會馬上知道......

+0

謝謝。我是否也需要在setter中將值賦給IReadOnlyList?否則,這個類實例中的數組是否指向可能被更改或置於類之外的內存? – Daniel 2014-10-11 16:43:51