事件
語法
訪問修飾符 event 委托名稱 事件名稱;
定義事件:
public event delTest eventTest;
eventTest += new delTest(method2);
自定義事件的基礎
1.當一個結果發生時,有可能引起另外的一些反應。這就好像因果關系。而事件,則是這個因與果的內部聯系。
2.在C#中,我們經常看到:
自定義事件的實例
從網上找了一個比較容易理解的自定義事件實例,記錄再次方便學習。原文地址://www.49028c.com/article/59459.htm
發布事件的類TestEventSource:
namespace EventDemo
{
/// <summary>
/// 發布事件的類
/// </summary>
public class TestEventSource
{
//定義事件參數類
public class TestEventArgs : EventArgs
{
public readonly char KeyToRaiseEvent;
public TestEventArgs(char keyToRaiseEvent)
{
KeyToRaiseEvent = keyToRaiseEvent;
}
}
//定義delegate
public delegate void TestEventHandler(object sender, TestEventArgs e);
//用event 關鍵字聲明事件對象
public event TestEventHandler TestEvent;
//事件觸發方法
protected virtual void OnTestEvent(TestEventArgs e)
{
if (TestEvent != null)
TestEvent(this, e);
}
//引發事件
public void RaiseEvent(char keyToRaiseEvent)
{
TestEventArgs e = new TestEventArgs(keyToRaiseEvent);
OnTestEvent(e);
}
}
}
監聽事件的類TestEventListener
namespace EventDemo
{
/// <summary>
/// 監聽事件的類
/// </summary>
public class TestEventListener
{
//定義處理事件的方法,他與聲明事件的delegate具有相同的參數和返回值類型
public void KeyPressed(object sender, TestEventSource.TestEventArgs e)
{
Console.WriteLine("發送者:{0},所按得健為:{1}", sender, e.KeyToRaiseEvent);
}
//訂閱事件
public void Subscribe(TestEventSource evenSource)
{
evenSource.TestEvent += new TestEventSource.TestEventHandler(KeyPressed);
}
//取消訂閱事件
public void UnSubscribe(TestEventSource evenSource)
{
evenSource.TestEvent -= new TestEventSource.TestEventHandler(KeyPressed);
}
}
}
測試:
namespace EventDemo
{
class Program
{
static void Main(string[] args)
{
//創建事件源對象
TestEventSource es = new TestEventSource();
//創建監聽對象
TestEventListener el = new TestEventListener();
//訂閱事件
Console.WriteLine("訂閱事件/n");
el.Subscribe(es);
//引發事件
Console.WriteLine("輸入一個字符,再按enter鍵");
string s = Console.ReadLine();
es.RaiseEvent(s.ToCharArray()[0]);
//取消訂閱事件
Console.WriteLine("/n取消訂閱事件/n");
el.UnSubscribe(es);
//引發事件
Console.WriteLine("輸入一個字符,再按enter健");
s = Console.ReadLine();
es.RaiseEvent(s.ToCharArray()[0]);
}
}
}
結果:
結論:
TestEventSource類。他就相當于windows控件類一樣,是事件的源,里面包含有事件的聲明,以及存儲調用參數的事件參數類,以及事件的觸發方法。
TestEventListener類。他提供了事件處理程序,并實現了事件處理程序和事件對象的邦定,當然時間處理程序可以放在別處, 跟邦定程序(訂閱事件)放在一起便于理解和調用
Test 類,實例化自定義事件的事件源對象,并調用 TestEventListener類中的Subscribe(es);方法進行事件對象和事件處理程序的邦定(訂閱事件),調用 TestEventSource類中的RaiseEvent(char keyToRaiseEvent)引發對象,并有對象所指定的委托回調處理事件。完成整個自定義事件。
其中 RaiseEvent(char keyToRaiseEvent) 就相當于main()一樣是自定義事件的執行入口, 從這個法開始---〉調用事件委托----〉查找訂閱事件程序找到事件所封裝的方法集----〉由委托回調事件處理程序并傳遞參數---〉執行事件處理程序。
委托與事件總結
委托的作用:
占位,在不知道將來要執行的方法的具體代碼時,可以先用一個委托變量來代替方法調用(委托的返回值,參數列表要確定)。在實際調用之前,需要為委托賦值,否則為null。
事件的作用:
事件的作用與委托變量一樣,只是功能上比委托變量有更多的限制。(比如:1.只能通過+=或-=來綁定方法(事件處理程序)2.只能在類內部調用(觸發)事件。)
委托:類型安全的指向函數的指針
使用步驟
1:聲明一個委托 delegate string DelString(string s)
2:定義一個委托變量
DelString del = new DelString(ToUpper)
DelString del = ToUpper
3:使用委托
del(s);
匿名方法*
多播委托
del += Sub; del = del + Sub;
del += Mul;
del -= Mul;
事件
原理 定義一個事件的時候生成一個私有的委托
通過生成的add和remove方法對委托注冊方法和移除方法
調用事件的時候最終調用的是委托指向的方法
使用步驟
1:定義事件
{
PlayOver(this, null);
}
p.PlayOver += new PlayOverEventHandler(p_PlayOver);
p.Play();
EventArgs 事件源參數
事件是成員
由于事件不是類型,所以我們不能使用對象創建表達式(new表達式)來創建它的對象
事件必須聲明在類或結構中,和其他成員一樣
我們不能在一段可執行代碼中聲明事件
事件被隱式自動初始化為null
事件使用的標準模式的根本就是System命名空間聲明的EventHandler委托類型。EventHandler委托雷池的聲明如下面代碼所示。
1.第一個參數用來保存觸發事件的對象的引用。由于是object類型,所以可以匹配任何類型的實例。
2.第二個參數用來保存有關狀態對于應用程序來說是否合適的狀態信息。
3.返回參數是void。
新聞熱點
疑難解答