C# 委托和事件

来源:互联网 发布:软件发信息 编辑:程序博客网 时间:2024/06/11 18:29

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();        }    }}/* OutputMessage:Delegate run!Time:18:35Message: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();        }    }}/* OutputI'm in test class!AI'm in test class!BI'm in test class!CI'm in test class!DI'm in test class!EI'm in test class!FI'm in test class!GI'm in test class!HI'm in test class!II'm in test class!J*/
原创粉丝点击