C#代表元及事件觸發 轉載

來源:互聯網
上載者:User
代表元是C#中比較複雜的概念,C#中的代表元和C/C++中的函數指標非常相似使用代表元可以把代表元內部方法的引用封裝起來然後通過它使用代表元引用的方法。
它有一個特性就是不需要知道被引用的方法屬於那一個類對象只要函數的參數個數與傳回型別與代表元對象一致。這樣說可能比較抽象我下面舉幾個簡單的例子希望能給廣大初學者一些基本的認識

//定義一個傳回值為string的無參數的代表元注意這個代表元只能引用對象中傳回值為string的無參數方法
delegate  string  MyDelegate();
public  class  MyClass
{
public  string  SayHello()
{
return  "Hello  the  world!";
}

}
public  class  TestMyClass
{
public  static  void  Main(string[]  args)
{
MyClass  myClass1=new  MyClass();
MyDelegate  myDelegate1=new  MyDelegate(myClass1.SayHello);
//下面就使用myDelegate1代替對象myClass1的SayHello方法
System.Console.WriteLine(myDelegate1());
//輸出結果為hello  the  world!  與調用myClass1.SayHello();效果相同
}
}
如果代表元只有這點功能它就沒有什麼太大的用處了,代表元還有一個非常有用的功能就是定義複合代表元對象只有同樣類型的代表元才能夠複合起來  +  能定義複合代表元對象  -  從一個複合代表元中去掉一個代表元對象
delegate  void  MyDelegate(string  s);
public  class  MyClass
{
public  void  SayHello(string  who)
{
System.Console.WriteLine(  who+"hello!");
}
public  void  SayGoodBye(string  who)
{
System.Console.WriteLine(  who+"good  bye!");
}

}

public  class  TestMyClass
{
public  static  void  Main(string[]  args)
{
MyClass  myClass1=new  MyClass();
MyDelegate  myDelegate,myDelegate1;
myDelegate=new  MyDelegate(myClass1.SayHello);
myDelegate1=new  MyDelegate(myClass1.SayGoodBye);
myDelegate+=myDelegate1;
//這樣調用myDeletage就相當於同時調用了myClass1.SayHello和myClass1.SayGoodBye
myDelegate("love.net  ");
//執行結果輸出love.net  hello!  love.net  good  bye!
}
}
事件驅動是windows應用程式的重要特徵  C#代表元就是用於產生事件,事件就是用於在一個組件中監聽這個組件的變化
下面再舉一個簡單的例子
//定義一個事件代理(代表元)
public  delegate  void  EventHandler(string  str);
//定義事件來源類
class  EventSource
{
//定義代表元作為事件來源類的成員
public  event  EventHandler  Say;
public  void  TriggerEvent()
{
if(this.Say!=null)
//因為Say是個代表元所以執行Say方法所做的實際操作由註冊到它的事件處理函數決定
Say("A  event  take  place!");
}
}
//測試
class  Test
{
public  static  void  Main()
{
EventSource  aEventSource=new  EventSource();
//註冊事件處理函數為MyEvent  顯示一串字元類似於this.Click+=new  EventHandler(Button1_OnClick);
aEventSource.Say+=new  EventHandler(MyEvent);
//此處為示範事件觸發過程所以就用程式自動觸發
//在圖形介面應用程式中,一般由使用者觸發事件,後由作業系統發送訊息並調用處理函數  所以程式員只要註冊事件處理函數
//和編寫事件處理函數的代碼其他就不用關心了
aEventSource.TriggerEvent();
}
//事件處理函數
public  static  void  MyEvent(string  str)
{
System.Console.WriteLine(str);
}

}

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.