索引器 讓類別實例支援 obj[index] 語法,本質是「帶參數的屬性」。適用於封裝集合、矩陣、快取、動態屬性包等場景。本文系統整理索引器語法規則、五大存取修飾詞、四大繼承修飾詞、多參數/重載模式與完整範例。
[修飾詞] 回傳型別 this[參數列表]
{
get { /* 回傳值 */ }
set { /* value 為指派值 */ }
}
| 特性 | 說明 |
|---|---|
| 關鍵字 | this 取代方法名,類別僅能定義一個名為 this 的索引器 |
| 參數 | 至少一個,型別任意(不限整數),可多參數 |
| 重載 | 支援簽章不同的多個索引器 |
| 存取修飾詞 | new、public、protected、internal、private |
| 繼承修飾詞 | virtual、sealed、override、abstract |
| 靜態 | 不支援 static(索引器屬於實例) |
| 基類呼叫 | override 時用 base[index] 存取基類實作 |
public class SampleCollection<T>
{
private readonly T[] _arr = new T[100];
public T this[int i]
{
get => _arr[i];
set => _arr[i] = value;
}
}
// 使用
var coll = new SampleCollection<string>();
coll[0] = "Hello, World";
Console.WriteLine(coll[0]); // Hello, World
public class Matrix<T>
{
private readonly T[,] _data;
public Matrix(int rows, int cols) => _data = new T[rows, cols];
public T this[int row, int col]
{
get => _data[row, col];
set => _data[row, col] = value;
}
}
var m = new Matrix<int>(3, 3);
m[1, 2] = 99;
Console.WriteLine(m[1, 2]); // 99
public class DualKeyStore<T>
{
private readonly Dictionary<string, T> _byName = new();
private readonly List<T> _byIndex = new();
public T this[string name]
{
get => _byName[name];
set => _byName[name] = value;
}
public T this[int index]
{
get => _byIndex[index];
set
{
if (index == _byIndex.Count) _byIndex.Add(value);
else _byIndex[index] = value;
}
}
}
public interface IStringIndexer<T>
{
T this[string key] { get; set; }
}
ArgumentOutOfRangeException 或回傳預設值,避免 IndexOutOfRangeException 洩露內部結構。get,適合不可變集合。get_Item/set_Item 方法,與直接呼叫方法效能相同,無額外開銷。index、key;多參數用 row/col、x/y。索引器是「語法糖」,將 obj.GetItem(i) 簡化為 obj[i],大幅提升 API 可讀性。掌握「單/多參數、重載、介面定義、繼承覆寫」完整語法,即可設計出如 List<T>、Dictionary<K,V>、DataTable 般直覺易用的集合型別。