C#中的委託和事件

委託是一個類,它定義了方法的類型,使得可以將方法當作另一個方法的參數來進行傳遞,這種將方法動態地賦給參數的做法,可以避免在程序中大量使用 If‐Else(Switch)語句,同時使得程序具有更好的可擴展性。
委託具有以下特點:
1、委託類似於C/C++函數指針,但它是類型安全的。
2、委託允許將方法作爲參數進行傳遞。
3、委託可用於定義回調方法。
4、委託可以將多個方法關聯在一起。例如,可以對一個事件調用多個方法。
5、委託所指向的方法不需要與委託簽名精確匹配。


定義和使用委託:
1、聲明委託類型
2、實例化委託對象
3、調用委託方法


事件是類在發生其關注的事情時用來提供通知的一種方式。當發生與某個對象相關的事件時,該類會使用事件將這一對象通知給用戶。這種通知即爲引發事件,引發事件的對象稱爲事件源或者發行者。
接收時間的對象稱爲訂閱者,訂閱者之所以會接到通知,是因爲訂閱者訂閱了事件源的該事件


事件的創建與使用
1、在事件源類的聲明中爲事件創建一個委託類型和聲明事件
2、在訂閱者類中創建時間處理方法
3、訂閱事件
4、創建引發事件的方法

5、引發事件


例子:委託

namespace @delegate
{
    delegate double mydelegate(double x, double y); //聲明委託類型
    class MyDeClass //聲明含有方法的類
    {
        public double add(double x,double y)
        {
            return x + y;
        }
        public double sub(double x,double y)
        {
            return x + y;
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            MyDeClass myDeClass = new MyDeClass();
            mydelegate p = new mydelegate(myDeClass.add);//mydelegate p=myDeClass.add   委託對象關聯方法
            Console.WriteLine("1+1={0}", p(1, 1));//調用委託對象
            p = myDeClass.sub;
            Console.WriteLine("2-1={0}", p(2, 1));
        }
    }
}

例子:事件

namespace @event
{
    public class Teacher
    {
        private string name;
        public delegate void delegateType();//聲明事件委託類型
        public event delegateType ClassEvent;//聲明一個上課事件
        public Teacher(string name)
        {
            this.name = name;
        }
        public void Start()//引發事件的方法
        {
            Console.WriteLine(name + "教師宣佈開始上課");
            if (ClassEvent != null)
                ClassEvent();//引發事件的語句
        }
        public class Student
        {
            private string sname;
            public Student (string name)
            {
                this.sname = name;
            }
            public void Listener()
            {
                Console.WriteLine("學生" + sname + "正在認真聽課");
            }
            public void Record()
            {
                Console.WriteLine("學生" + sname + "正在做筆記");
            }
        }

        class Program
        {
            static void main(string[] args)
            {
                Teacher t = new Teacher("李明");
                Student s1 = new Student("小明");
                Student s2 = new Student("大明");
                t.ClassEvent += new Teacher.delegateType(s1.Listener);
                t.ClassEvent += new Teacher.delegateType(s2.Record);
                t.Start();//引發事件
            }
        }

    }
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章