C# 委托和事件

C# 委托和事件

1.方法作为函数参数时使用委托作为其类型的声明

namespace normal
{
    public class test
    {
        public delegate void SimpleDelegate(string m);
        public void ShowMessage(string message)
        {
            Console.WriteLine(message);
        }
        public void UseDelegate(string message, SimpleDelegate showMessage)
        {
            showMessage(message);
        }
    }

    class Program
    {      
        static void Main(string[] args)
        {
            test t = new test();
            t.UseDelegate("Delegate run!", t.ShowMessage);
            Console.ReadKey();
        }
    }
}

2.方法绑定到委托

namespace normal
{
    public class test
    {
        public delegate void SimpleDelegate(string m);
        public void ShowMessage(string message)
        {
            Console.WriteLine("Message:" + message);
        }
        public void ShowTime(string time)
        {
            Console.WriteLine("Time:" + time);
        }
        public void UseDelegate(string message, SimpleDelegate showMessage)
        {
            showMessage(message);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            test t = new test();
            test.SimpleDelegate d, d1, d2;
            d1 = t.ShowMessage;//绑定方法
            d2 = t.ShowTime;

            t.UseDelegate("Delegate run!", d1);
            t.UseDelegate(System.DateTime.Now.ToShortTimeString(), d2);

            d = t.ShowMessage;//绑定多个方法,第一个方法必须用"="号赋值,后续方法用"+="
            d += t.ShowTime;
            t.UseDelegate("Delegate run!", d);//多个方法按照添加的顺序执行

            d -= t.ShowMessage;//去除某个方法
            t.UseDelegate("Delegate run!", d);

            d("Direct use!");//直接调用

            Console.ReadKey();
        }
    }
}
/* Output

Message:Delegate run!
Time:18:35

Message:Delegate run!
Time:Delegate run!

Time:Delegate run!

Time:Direct use!

*/

3.事件声明与绑定

namespace normal
{
    public class test
    {
        public event SimpleDelegate EVENT;
        public delegate void SimpleDelegate(string m);
        public void ShowMessage(string message)
        {
            Console.WriteLine("Message:" + message);
        }
        public void ShowTime(string time)
        {
            Console.WriteLine("Time:" + time);
        }
        public void UseDelegate(string message)
        {
            EVENT(message);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            test t = new test();  

            t.EVENT += t.ShowMessage;
            t.EVENT += t.ShowTime;
            t.UseDelegate("Event run!");

            Console.ReadKey();
        }
    }
}

事件使用委托来声明。

事件只能用”+= / -=”赋值。

它封装了委托类型的变量,使得在类的内部,不管你声明它是public还是protected,它总是private的。

声明一个事件类似于声明一个进行了封装的委托类型的变量。

4. .Net Framework中的委托与事件

  • 委托类型的名称以EventHandler结束

  • 委托类型的参数有两个分别是(object sender, EventArgs e)

    参数EventArgs也可以是该类型的继承类

  • 事件的命名是委托名称去掉EventHandler的部分

  • 继承EventArgs的类名称以EventArgs结尾

namespace normal
{
    class test
    {
        public string s = "I'm in test class!";
        public delegate void ShowEventHandler(object sender, ShowEventArgs e);
        public event ShowEventHandler Show;
        public class ShowEventArgs : EventArgs
        {
            public readonly char s;
            public ShowEventArgs(char param)
            {
                s = param;
            }
        }

        public void WaitMessage()
        {
            char ch = 'A';
            for (int i = 0; i < 10; i++)
            {             
                Show(this, new ShowEventArgs(ch++));
                Thread.Sleep(500);
            }
        }
    }
    class Display
    {
        public void ShowMessage(object sender, test.ShowEventArgs e)
        {
            test t = (test)sender;
            Console.WriteLine(t.s + "\n" + e.s);
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            test t = new test();

            t.Show += (new Display()).ShowMessage;
            t.WaitMessage();

            Console.ReadKey();
        }
    }
}
/* Output

I'm in test class!
A
I'm in test class!
B
I'm in test class!
C
I'm in test class!
D
I'm in test class!
E
I'm in test class!
F
I'm in test class!
G
I'm in test class!
H
I'm in test class!
I
I'm in test class!
J
*/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值