回答
嗯,你可以從Collection<T>
派生新類和重寫SetItem
和InsertItem
:如果新值爲null拋出異常。這是你想要的那種東西嗎?
這將是:
- 自定義:好,你要覆蓋方法來定製的正常行爲
- 類型安全:由於從
Collection<T>
獲得的;基類防止被添加 - 空安全不合適的類型的值:你的覆蓋將防止曾經存在收集
在空值你甚至可以把它通用:
// Note: you could include "where T : class"; on the other hand
// you might have some reason to want a NullSafeCollection<int?>
// which you knew had no null values in.
public class NullSafeCollection<T> : Collection<T>
{
protected override InsertItem(int index, T item)
{
if (item == null)
{
throw new ArgumentNullException("item");
}
base.InsertItem(index, item);
}
// Likewise for SetItem
}
哦,不,Skeet是在房子裏,有任何一個upvote的機會,更不用說接受的答案 – 2010-04-04 18:32:18
@Ben:那麼目前你有一個upvote,我沒有,所以... :) – 2010-04-04 18:34:22
我認爲問題在於模棱兩可的術語「無效安全」。
一般來說,對於類型安全集合,您將使用泛型,而不是繼承。
所以我想要的是一個派生的集合,它在一些標準的泛型集合之上添加了「空安全檢查」(不管你的情況如何)。除了在C#中的泛型集合不使用虛函數,所以它們不能被擴展(誰選擇這樣做,而不使這些類被封閉應該永遠被禁止編程)。
因此,您必須使用舊的.NET 1.x非泛型集合(如集合),並使用「類型安全檢查」和「空安全檢查」來覆蓋它們。
在另一方面,如果你在這個意義上我,然後是較常見的集合,如List<T>
,LinkedList<T>
,Stack<T>
,Queue<T>
是已經在使用「空安全」,「空安全的」,因爲它們不死機或者如果您通過null
則生成例外。另一方面,Dictionary<TKey,TValue>
由於它在參數上調用GetHashCode,因此不是無效的。你必須修改它們來定義null
的散列碼。 HashSet<T>
實際上是這樣做的,將0
定義爲null
的散列。同樣,對於SortedList<TKey,TValue>
和SortedDictionary<TKey,TValue>
,您必須定義排序順序中的null
。
據我所知,沒有辦法使這些集合行爲正確。在這些類中缺少null
支持並不是由散列函數或比較器在傳入null
時失敗引起的,它是由所有面向公衆的API中的先發制人檢查導致的。這些不能通過公共繼承來解決,而C#(通常.NET)不允許私有繼承。在光明的一面,System.Collections.ObjectModel.KeyedCollection<TKey,TItem>
竭盡全力不讓空字符被底層字典看到。但它擴展了Dictionary<TKey,TValue>
以通過遏制而不是繼承來增加無效安全。
我認爲這是合理的推斷「無效安全集合」是防止添加空值的集合。我會說使用泛型和繼承是正交選擇。 – 2010-04-04 18:35:14
不適用於'列表
- 1. 類型安全通過繼承
- 2. 區域的安全繼承?
- 3. 使自定義的C#集合線程安全
- 4. 類型安全的代理創建
- 5. 使用類型安全的集合類有什麼好處?
- 6. 在JavaScript中安全地繼承原型
- 7. 繼承安全規則 - SecurityRuleSet.Level2
- 8. Android - 通過繼承安全
- 9. 無法創建繼承類的集合
- 10. ninject mvc4中違反了類型:'Ninject.Web.Mvc.Filter.FilterContextParameter'的繼承安全規則
- 11. 自定義.formLogin()Spring安全
- 12. 爲升級安全定製創建一個自定義的sugar_3.js文件
- 13. 重定向到來自安全(https)的不安全內容(http)
- 14. 類型安全配置安全rendeing
- 15. 創建安全連接的Apache自定義錯誤處理
- 16. 以類型安全的方式使用另一個實例的屬性子集創建一個實例?
- 17. 安全的休息API使用彈簧安全 - 自定義狀態代碼
- 18. 類型安全objectdatasources
- 19. 「類型安全」UUID?
- 20. 使用ViewGroup.LayoutParams時的類型安全性
- 21. 使用DWARF的類型安全鏈接
- 22. 獲取集合的動態類型安全視圖」通過集合類
- 23. DotNetOpenAuth「違反了繼承安全規則」
- 24. 如何使用類型安全的CSS加載自定義字體?
- 25. 使用isKindOfClass安全嗎:針對NSString實例來確定類型?
- 26. Java集合中更好的類型安全
- 27. 創建自APIView繼承的自定義抽象視圖類
- 28. 是繼承被認爲是安全的查看模型
- 29. 創建自定義HTML標籤是否安全?
- 30. 如何在春季安全創建自定義UserDetail對象
你沒有明確的目標或實施?我問,因爲如果你不清楚目標,我們可以怎樣幫助你? 「無效安全」是什麼意思? – 2010-04-04 18:27:21
我相信,我懷疑無意義的「無效安全」的普通術語是「不可空的」。我自己,我會以完全不同的方式使用「無效的安全」。 – 2010-04-04 18:36:45