2011-10-11 40 views
4

有問題的數組是一個字節流。返回數組的問題是它不是隻讀的,因此庫的客戶端可以修改其內容。從庫而不是數組返回什麼樣的集合類型?

有包裝的陣列我不知道選哪個這麼多不同的方式:

IEnumerable, IList, List, ReadOnlyCollection, Collection, et cetera.

此外,返回類型可以是從實際的實例類型不同。

我最初的辦法是做這樣的事情:

Data = new ReadOnlyCollection<byte>(data);

data是一個字節數組。 Data屬性應該是一些接口類型(IEnuerable,IList等等)。但是,我不確定要使用哪一個。我看到很多人推薦IEnumerable,因爲它非常標準,但順序很重要,在我看來,一串字節應該保持與數組的語法相似性。 IEnumerable不允許訪問各個標記,因此它顯然不是這裏的最佳選擇。

IList不是隻讀的,所以我想ICollection會是正確的..?不確定。似乎有這麼多的集合類型,我對使用哪個類型感到困惑。

回答

2

我會試圖返回IList<byte>並記錄列表是不可變的。這爲您提供了稍後更改實施的靈活性的混合體,但意味着呼叫者不需要使用IEnumerable<T>的「最低公分母」。

使用IList<byte>作爲聲明類型,您仍然可以返回ReadOnlyCollection<byte>作爲實現。

或者像達林提到,您可以使用Stream - 特別是MemoryStream

return new MemoryStream(data, false); 

這將是一個只讀流。如果客戶想要的數據看作流(例如傳遞給XML解析器或圖像加載器等),那麼這將是最好的。你只需要聲明它返回Stream--明確聲明它返回MemoryStream(除非調用者想要調用ToArray當然)幾乎沒有什麼好處。您應該記錄返回的流是可讀的,可查找的,但不可寫。

如果他們真的想把它作爲一個集合,IList<T>更好。

1

如何直接返回Stream而不是字節數組?根據您期望的客戶能夠對結果做什麼,可能會有不同的方法。如果他們可以修改字節數組是否真的很糟糕?即使你返回一個IEnumerable<T>,他們仍然可以調用.ToArray()擴展方法並獲得一個字節數組。所以我不認爲從消費者那裏修改內存中的字節數組應該是一個問題。

+1

如果對象「擁有」數據並且不想讓人們更改其數據,那麼這很重要。是的,他們可以調用'ToArray'來創建一個副本,但這不是一回事 - 在沒有必要的情況下強制*創建副本是一件令人遺憾的事情。 'MemoryStream'和'ReadOnlyCollection '在這方面都更好。 –

1

我會建議返回一個MemoryStream。你可以構造它,使它是隻讀的。

相關問題