C# 2.0 引入泛型,解決了 1.x 時代 `ArrayList` 等非泛型集合的裝箱/拆箱性能損耗與類型安全缺失問題。本文通過實現一個簡易泛型列表 `BList
using System;
using System.Collections; // 僅為內部使用 ArrayList 演示,實際建議用 T[]
namespace WindowsApplication1
{
public class BList<T>
{
// 內部存儲 (教學演示用 ArrayList,生產環境應用 T[] + 動態擴容)
private readonly ArrayList _innerList = new ArrayList();
// 索引器:提供類數組訪問體驗
public T this[int index]
{
get
{
// 運行時類型檢查,若 T 為值類型會發生拆箱
return (T)_innerList[index];
}
set
{
// 添加或替換邏輯:此處簡化為 Add,實際應按索引插入/替換
_innerList.Add(value);
}
}
// 添加方法
public void Add(T item) => _innerList.Add(item);
// 數量屬性
public int Count => _innerList.Count;
}
}
private void button2_Click(object sender, EventArgs e)
{
// 1. 實例化指定類型參數 (此處為 int)
BList<int> list = new BList<int>();
// BList<string>, BList<Customer> 等同理
// 2. 添加元素 - 編譯期強制類型檢查
for (int i = 0; i < 10; i++)
{
list.Add(i); // 僅接受 int,傳入 string 將編譯報錯
}
// 3. 遍歷訪問 - 無裝箱拆箱,直接返回 int
for (int i = 0; i < list.Count; i++)
{
int value = list[i]; // 直接獲取 int,無需 (int) 轉換
MessageBox.Show(value.ToString());
}
}
| 特性 | ArrayList (非泛型) | BList<T> / List<T> (泛型) |
|---|---|---|
| 類型安全 | 運行時發現類型錯誤 | 編譯期強制檢查 |
| 值類型性能 | 每次 Add/Get 發生裝箱/拆箱 | 零裝箱,直接存儲值 |
| 代碼復用 | 單一 Object 版本 | 一份代碼服務所有類型 |
| 可讀性 | 需大量轉型 | 類型意圖清晰 |
// 要求 T 實現 IComparable,可調用 CompareTo
public class SortedList<T> where T : IComparable<T> { ... }
// 要求 T 有公共無參構造函數
public class Factory<T> where T : new() { ... }
// 要求 T 為引用類型 / 值類型
public class RefWrapper<T> where T : class { ... }
public class ValWrapper<T> where T : struct { ... }
public interface IRepository<T> { void Add(T entity); T GetById(int id); }
public delegate TResult Func<in T, out TResult>(T arg); // 協變/逆變
public void Swap<T>(ref T a, ref T b) { T temp = a; a = b; b = temp; }
// 調用:Swap<int>(ref x, ref y); 或 Swap(ref x, ref y); (類型推斷)
泛型是 C# 類型系統的基石。通過 `BList