• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • C#代表元及事件觸發

    發表于:2007-07-14來源:作者:點擊數: 標簽:
    C#代表元及事件觸發:代表元是C#中比較復雜的概念,C#中的代表元和C/C++中的函數指針非常相似使用代表元可以把代表元內部方法的引用封裝起來然后通過它使用代表元引用的方法。 它有一個特性就是不需要知道被引用的方法屬于那一個類對象只要函數的參數個數與
    C#代表元及事件觸發:代表元是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);
    }

    }

    原文轉自:http://www.kjueaiud.com

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>