C# 索引器讓類別實例像陣列一樣以 obj[index] 存取內部資料,隱藏具體方法名稱,提升程式碼可讀性。本文為系列第一篇,對比傳統方法與索引器語法,闡述核心優勢。
// 傳統方法
public class DataAccess
{
private Dictionary _data = new();
public string GetData(int id) => _data.TryGetValue(id, out var v) ? v : null;
public void SetData(int id, string value) => _data[id] = value;
}
// 使用者程式碼
var da = new DataAccess();
string val = da.GetData(10); // 需記住方法名
da.SetData(10, "Hello");
// 索引器版本
public class DataAccess
{
private Dictionary _data = new();
public string this[int id]
{
get => _data.TryGetValue(id, out var v) ? v : null;
set => _data[id] = value;
}
}
// 使用者程式碼
var da = new DataAccess();
string val = da[10]; // 直觀如陣列
da[10] = "Hello";
obj[i] 編譯為 get_Item(i)/set_Item(i, value),無執行期開銷。IList、IDictionary 等標準介面時,索引器是必要成員。virtual、override、interface 實作。
public class MyClass
{
// 單一參數
public T this[int index] { get; set; }
// 多參數
public T this[int x, int y] { get; set; }
// 唯讀
public T this[string key] { get; }
// 介面顯式實作
string IList.this[int index] { get => ...; set => ...; }
}
索引器是 C# 型別系統的重要表達力擴充。掌握基本語法後,後續文章將探討多維資料、複合鍵、多重檢索路徑、委派策略等進階應用模式。