程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> C# 中使用 List<struct T> 時的問題

C# 中使用 List<struct T> 時的問題

編輯:.NET實例教程
 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;            // 返回的是拷貝,不是嗎?
  }

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved