回調和回調函數是什么
軟件模塊之間存在著接口,而回調是一種雙向調用模式,被調用方在接口被調用時也會調用對方的接口。
對于一般的結構化語言,可以通過回調函數來實現回調。回調函數是一個函數或過程,是一個由調用方自己實現,供被調用方使用的函數。
對于C和C++來說,一般通過函數指針實現調用。
對于C#來講,聲明的委托事件就像一個指針,通過事件變量來調用另外的方法,將該方法作為參數傳遞給另一個方法。回調函數是一個工作流的一部分,由工作流來決定函數的調用(回調)時機。
怎么實現?
通過聲明委托來實現回調。
我們在C#編程經常會遇到事件觸發流程,定義這個事件的方法就是回調函數。回調函數實際上就是將某種行為即方法存儲下來,在需要的時候進行調用。它通過委托實現,并不一定是事件還是委托變量來調用。
先看一個典型C#委托聲明代碼:
public delegate void EventHandler( object sender , EventArgs e )
其中object sender:表示觸發事件的控件對象 ,sender參數用于傳遞指向事件源對象的引用。使用sender 可以查出觸發事件的具體控件。
EventArgs是包含事件數據的類的基類,用于傳遞事件的細節,是一些事件附屬的信息。
using System;namespace 回調函數
{//1.聲明關于事件的委托;public delegate void AlarmEventHandler(object sender, EventArgs e);class Dog{//2.聲明事件; public event AlarmEventHandler Alarm;//3.編寫引發事件的函數;public void OnAlarm(){if (this.Alarm != null){Console.WriteLine("\n汪汪~~~~~~~");this.Alarm(this, new EventArgs()); //發出警報}}}//事件接收者class Host{//4.編寫事件處理程序void HostHandleAlarm(object sender, EventArgs e){Console.WriteLine("主人: 嚇死寶寶!");}//5.注冊事件處理程序public Host(Dog dog){dog.Alarm += new AlarmEventHandler(HostHandleAlarm);}}class Thief{void ThiefHandleAlarm(object sender, EventArgs e){Console.WriteLine("小偷: 嚇死寶寶!");}public Thief(Dog dog){dog.Alarm += new AlarmEventHandler(ThiefHandleAlarm);}}class Program{static void Main(string[] args){Dog dog = new Dog();Host host = new Host(dog);Thief thief = new Thief(dog);//當前時間,從2021年3月9日23:59:50開始計時DateTime now = new DateTime(2021, 3, 9, 23, 59, 55);DateTime midnight = new DateTime(2021, 3, 10, 0, 0, 0);//等待午夜的到來Console.WriteLine("時間一秒一秒地流逝... ");while (now < midnight){Console.WriteLine("當前時間: " + now);System.Threading.Thread.Sleep(1000); //程序暫停一秒now = now.AddSeconds(1); //時間增加一秒}Console.WriteLine("\n月黑風高的午夜: " + now);Console.WriteLine("小偷悄悄地摸進了女主人的屋內... ");dog.OnAlarm();Console.ReadLine();}}
}
參考文章:
理解C#回調函數
C# (事件觸發)回調函數,完美處理各類疑難雜癥!