作者分享一個教學案例:學生預期 object m_obj = m_isRight ? MyWrite("true") : MyWrite("false"); 會輸出 "false false",實際上這將函式呼叫結果(int)裝箱賦值給 object,而非函式本身。這反映出初學者直覺希望「函式也是一等物件,可直接賦值傳遞」——這正是委派存在的意義。
delegate int MyDelegate(object obj);MyDelegate d = new MyDelegate(MyWrite);d("參數"); 等同 MyWrite("參數");delegate int MyDelegate(object i_object);
static void Main()
{
MyDelegate d = new MyDelegate(MyWrite);
d("透過委派呼叫原函式");
}
static int MyWrite(object s)
{
Console.WriteLine(s);
return s.ToString().Length;
}
事件解決「執行期動態增減處理函式」的需求,本質是對委派的受限封裝:
event MyDelegate MyEvent;(外部不可直接賦值,只能 +=/-=)MyEvent += new MyDelegate(Handler); 或 MyEvent += Handler; (C# 2.0+)MyEvent -= Handler;(不存在不報錯)if (MyEvent != null) MyEvent(sender, args);(依序呼叫所有已註冊處理器)MyEvent.GetInvocationList().Lengthpublic delegate void MyEventHandler(object sender, object arg);
public class Publisher
{
public event MyEventHandler OnError;
public event MyEventHandler OnSomethingHappened;
public void Run()
{
Random r = new Random();
while (!stop)
{
int n = r.Next(100);
if (n % 5 == 0) OnError?.Invoke(this, n);
else OnSomethingHappened?.Invoke(this, n);
}
}
}
理解此層級關係,即掌握 C# 事件驅動程式設計的核心。