C# 2.0 中加入了泛型,只是與 C++ 的泛型相差極多,只具有最簡單的泛化
而以,像 STL 重頭戲的 traits 是無法使用的了(不過 sf.Net 上有一個 CSTL
(C# STL)的項目,初具形狀)。
.Net 2.0 加入了一系列的泛型容器,如 List<T>,Dictionary<Key,
Value> 等。這些容器對於引用(Object 及子類)類型和原生數據類型(如 int,
double 等)支持得很好,然而對 struct 類型的元素的支持卻有問題。這裡所說
的問題是指,List<T> 並不能對等的代替 T[]。struct 類型的問題在於,你不能
直接修改 List<struct T> 中元素的成員。
產生問題的原因在於,C# 只有針對“對象”的引用,而沒有 C++ 那樣針對
值類型的引用。struct T 是值類型,所以你在索引 List<struct T> 元素的時候,
返回的只是元素的一個值拷貝。自然,你對這個拷貝的成員的修改不會影響到真
實的元素。幸運的是,C# 編譯器禁止這種操作。代碼如下:
struct T
{
public int a;
}
List<T> list;
list.Add(new T());
list[0].a = 100; // 編譯錯誤!!
// 實際你要這樣做:
T t = list[0];
t.a = 100;
list[0] = t;
在上面的代碼裡,我的解決辦法是復制到一個臨時變量,修改值,然後回寫。
為什麼不能修改真實的元素,考慮如下代碼:
public T this[int index]
{
get
{
T t = list[index];
return t; // 返回的是拷貝,不是嗎?
}
}