索引子讓類別實例可像陣列一樣使用索引器存取元素。語法類似屬性,但使用 this 關鍵字且參數列表至少一個參數。範例:
public string this[int index] {
get { ... }
set { ... }
}
實際應用範例:ResolveDNS 類別解析主機名稱取得 IP 位址清單,透過索引子存取:
public class ResolveDNS {
private IPAddress[] _ips;
public void Resolve(string host) {
IPHostEntry entry = Dns.GetHostEntry(host);
_ips = entry.AddressList;
}
public IPAddress this[int index] {
get { return _ips[index]; }
}
public int Count { get { return _ips.Length; } }
}
// 使用方式
ResolveDNS resolver = new ResolveDNS();
resolver.Resolve("www.microsoft.com");
for (int i = 0; i < resolver.Count; i++)
Console.WriteLine(resolver[i]);
注意:索引子可多載(不同參數型別),若實作多個介面可用 InterfaceName.this 語法區分。
事件型別必須為委派型別。委派定義回調方法簽章,事件可被零或多個用戶端訂閱(+=)或取消訂閱(-=)。支援靜態與實例方法作為處理常式。
// 定義委派型別
public delegate void EventHandler(string text);
// 事件發送者
public class EventSource {
public event EventHandler TextOut;
public void TriggerEvent() {
if (TextOut != null) TextOut("Event triggered");
}
}
// 用戶端
public class TestApp {
public static void Main() {
EventSource src = new EventSource();
// 訂閱靜態方法
src.TextOut += new EventHandler(CatchEvent);
src.TriggerEvent();
// 取消訂閱
src.TextOut -= new EventHandler(CatchEvent);
src.TriggerEvent();
// 訂閱實例方法
TestApp app = new TestApp();
src.TextOut += new EventHandler(app.InstanceCatch);
src.TriggerEvent();
}
public static void CatchEvent(string text) {
Console.WriteLine(text);
}
public void InstanceCatch(string text) {
Console.WriteLine("Instance " + text);
}
}
關鍵點:
!= null,避免無訂閱者時拋出例外。this 參考。類別與成員支援 public、private、protected、internal、protected internal 五種存取層級,控制跨組件、跨衍生類別的可見性。合理使用存取修飾詞是封裝與資訊隱藏的關鍵。
索引子提供直覺的集合存取介面,事件實現鬆耦合的通知機制,委派則是類型安全的回調基礎。三者結合讓 C# 類別能設計出豐富、靈活且符合 .NET 設計規範的 API。