2012-10-23 84 views
1

我不知道爲什麼代碼分析(在VS 2012)發出返回一個數組的「CA1819:屬性不應返回數組」,爲下面的代碼:替代從一個屬性的getter

private byte[] BackingFieldData; 

public byte[] Data 
{ 
    get { return this.BackingFieldData; } 
    set { this.BackingFieldData = value; } 
} 

的說明警告狀態屬性返回的數組不受寫保護,即使該屬性是隻讀的。爲了防止數組防篡改,該屬性必須返回數組的副本。

我想要的是返回數組。用戶應該能夠修改數組,但不應該調整它的大小。數組的大小經常被用戶訪問。用戶必須能夠通過索引訪問元素。因此數組類型似乎完全適合。

候補委員,我認爲是IEnumerable<byte>IList<byte>(索引使用SkipTake等非常完成)(側重於添加和刪除元素 - 我不希望出現這種情況),並ReadOnlyCollection<byte>(我討厭類公開方法總是扔NotSupportedException s,遠離良好的編碼風格恕我直言)。我還想過在數組周圍創建一個包裝類的自定義接口 - 但是,這有什麼意義呢(除了我可以在不壓制它的情況下襬脫這個警告)。

因此,沒有人知道一個良好的類型返回數組類型或一個很好的理由不要在這種情況下返回數組呢?我到目前爲止沒有提到什麼影響?

回答

5

在這種情況下,應該抑制警告。
大多數陣列準則並不適用於byte[]秒。

不過,你也應該刪除(或private IZE)的制定者。

+0

+1對於'私有化':D(因爲如果不允許他們改變長度,這是一個好點)。 – Rawling

+0

+1 public setter是一個錯誤,我總是看到任何集合類型。 –

+0

對不起,5行代碼已經是bug了;-)。在我的實施中根本沒有二傳手。只有在演示代碼中;我想看看是否也有警告,如果有setter可用... – Korexio

0

.NET框架4.5提供了IReadOnlyList<T> Interface

陣列可分配給一個IReadOnlyList<T>無需轉換等 - IMHO的最佳解決方案。

+0

我不明白。這是一個解決方案?在這個問題中,你說「用戶應該可以修改陣列」。但是這不能通過IReadOnlyList接口完成。 – Henrik

+0

@亨利克:你完全正確;我已經開始使用'IReadOnlyList '擺脫的情況下,警告如果用戶並不需要修改的內容。我還沒有找到解決我最初的問題。 – Korexio