承接上集基礎語法,本文深入探討 C# 物件導向核心機制:屬性封裝存取邏輯、索引子提供陣列式存取、事件實作發布-訂閱、版本控制解決 DLL 地獄、以及屬性標記賦予中繼資料能力。
public class Button : Control
{
private string _caption;
public string Caption
{
get => _caption;
set
{
_caption = value;
Repaint(); // 附加副作用
}
}
}
btn.Caption = "OK"; / var s = btn.Caption;public string Name { get; set; } 編譯器自動產生背端欄位public class ListBox : Control
{
private string[] _items;
public string this[int index]
{
get => _items[index];
set
{
_items[index] = value;
Repaint();
}
}
}
this,支援多維度參數:this[int x, int y]delegate void EventHandler(object sender, EventArgs e);public event EventHandler Click;btn.Click += Handler; / btn.Click -= Handler;Click?.Invoke(this, EventArgs.Empty);// 欄位型(預設)
public event EventHandler Click;
// 屬性型(可自訂 add/remove 邏輯)
public event EventHandler Click
{
add => _click += value;
remove => _click -= value;
}
private EventHandler _click;
兩者對呼叫端行為相同,屬性型允許攔截訂閱邏輯(如記錄、執行緒封送)。
// 作者 A v1
class Base { }
// 作者 B 衍生
class Derived : Base { public virtual void F() {} }
// 作者 A v2 新增虛擬方法
class Base { public virtual void F() {} } // 衝突!
| 關鍵字 | 語意 | 適用情境 |
|---|---|---|
| new | 隱藏基底成員,非覆寫 | 衍生類別成員與新基底成員無關,單純同名 |
| override | 覆寫基底虛擬成員 | 衍生類別確實要擴充/修改基底行為,需呼叫 base.F() |
| (無關鍵字) | 編譯器警告,預視為 new | 不建議,應明確指定 |
// v2a: 使用 new 隱藏
class Derived : Base
{
new public virtual void F() { Console.WriteLine("Derived.F"); }
}
// v2b: 使用 override 覆寫
class Derived : Base
{
public override void F() { base.F(); Console.WriteLine("Derived.F"); }
}
[AttributeUsage(AttributeTargets.All)]
public class HelpAttribute : Attribute
{
public HelpAttribute(string url) => Url = url;
public string Url { get; }
public string Topic { get; set; }
}
[Help("https://docs.example.com/Class1.htm")]
public class Class1
{
[Help("https://docs.example.com/Class1.htm#F", Topic = "F")]
public void F() { }
}
var type = typeof(Class1);
var attrs = type.GetCustomAttributes(typeof(HelpAttribute), false);
if (attrs.Length > 0)
{
var ha = (HelpAttribute)attrs[0];
Console.WriteLine($"Url: {ha.Url}, Topic: {ha.Topic}");
}
[Obsolete("Use NewMethod()"):標記過時 API,編譯警告[Serializable]:允許序列化[Conditional("DEBUG"):條件編譯方法呼叫[CallerMemberName] / [CallerFilePath] / [CallerLineNumber]:自動取得呼叫端資訊屬性、索引子、事件構成 C# 表達領域模型的三大支柱;版本控制機制(new/override)保障元件獨立演進;屬性標記則賦予程式碼豐富中繼資料,支援框架級功能(序列化、驗證、DI、AOP 等)。熟練運用這些機制,是撰寫專業級 C# 程式碼的關鍵。