我'試圖創建一個包含泛型類型
列表的通用類,但我想有null以外的默認值來檢查,如果一個項目被刪除
名單應該看像這樣默認不爲空一般價值
0 TypeV (some value of TypeV)
1 null
2 null (never been used)
3 default (deleted)
4 TypeV
有什麼想法嗎?
我'試圖創建一個包含泛型類型
列表的通用類,但我想有null以外的默認值來檢查,如果一個項目被刪除
名單應該看像這樣默認不爲空一般價值
0 TypeV (some value of TypeV)
1 null
2 null (never been used)
3 default (deleted)
4 TypeV
有什麼想法嗎?
對於參考類型,默認值爲null
(您不能定義值是否從未使用,或者它已被刪除)。所以你的想法不適用於引用類型的泛型參數。另一方面,對於非引用類型你不能有空值。所以,唯一的選擇就是對象(它可以容納兩個空值和值類型)的數組:
// TODO: check for index fit array range
public class Foo<T>
where T : struct
{
object[] values = new object[5];
public void Add(T value, int index)
{
// TODO: do not allow to add default values to array
values[index] = value;
}
public void Delete(int index)
{
values[index] = default(T);
}
}
而且
Foo<int> foo = new Foo<int>();
foo.Add(1, 0);
foo.Add(2, 3);
foo.Add(3, 4);
foo.Delete(3);
此時values
將是:
0 1 (some value of T)
1 null (never been used)
2 null (never been used)
3 default (deleted)
4 3
但無論如何,你無法定義某個項目是否被刪除,或者它是否添加了默認值。所以,如果你從不將默認值添加到arra年。
但是,如果我們要使用對象,有泛型的點是什麼 – user1748906
@ user1748906同樣的問題我想問你 - 看你的樣本和我的解釋爲什麼只有對象符合你的需求 –
我想你是對的,你的解決方案的工作原理即使有引用類型,如果我有一個靜態只讀字段DEFAULT = new object(); – user1748906
如果TypeV
是不是你的控制之下,然後它可以永遠是值類型,在這種情況下,絕對沒有,可以用來作爲一個標記值(對於引用類型,你可以有一個哨兵值,並使用object.ReferenceEquals
來檢查一個插槽是否包含它)。這意味着唯一可能的實現是在列表中每個插槽使用一個額外的信息位。
合理的選擇是保留List<Tuple<TypeV, bool>>
並使用bool
作爲「已刪除」標誌。
我無法解析「來檢查一個項目是否被刪除 該列表應該看起來像這樣」 –
mmm我的意思是如果我有一些類型的正常數組(字符串)數組中的所有項目都設置爲null,如果我添加了一個項目,然後再刪除它如何知道那裏有一個項目? – user1748906