c#事件(event)

事件:事件是委托的一个实例,加上关键字event.事件必须在事件的类中去声明invoke或者赋值,不能在事件外面或者子类中去invoke或者赋值。

委托跟事件的区别:委托是一个类,事件是委托的实例。加上关键字event.

为什么要用事件:一个方法中,有固定不变的和可变的逻辑,委托完全固定不变的,把可变的排除在外,由外部去控制,事件就是完成可变的部分,以及支持扩展。

堆代码的时刻到了:

   public event EventHandler PublishEventMessage;//事件
        //EventHandler:定义有两个参数无返回值的委托

        /// <summary>
        /// 触发者
        /// </summary>
        /// <param name="name"></param>
        public void Messages(string name)  
        {
            Console.WriteLine("事件的发布者");
            Console.WriteLine(name);
            if (!string.IsNullOrWhiteSpace(name))
            {
             
                PublishEventMessage.Invoke(this,new Company()
                {
                    CompanyName="腾讯",
                    HRName="马云",
                    Message="招.net开发"

                    
                });
            }
        }
    }

 

  public class read
    {
        public void ReadMessages(object send, EventArgs args)
        {
            var a = (Company)args;
            Console.WriteLine("HR姓名:"+a.HRName+",公司的名字:"+a.CompanyName+",司招聘信息:" + a.Message);
            Console.WriteLine("招聘者小王已经订阅此消息");
        }
    }

 

  public class Company:EventArgs
    {
       public string HRName { get; set; }
       public string CompanyName { get; set; }
       public string Message  { get; set; }

     
    }

 

  static void Main(string[] args)
        {
            CommandClass model = new CommandClass();
            read reads = new read();
            model.PublishEventMessage += reads.ReadMessages;
            model.Messages("来招聘了");
        }

 

运行结果:

 如果你搞不清楚 EventHandler 关键字,或者不喜欢用可以这样写

 public class CommandClass
    {

        public delegate void PublishMessage(Company model);//委托

        public event PublishMessage PublishEventMessage;//事件
        //EventHandler:定义有两个参数无返回值的委托

        /// <summary>
        /// 触发者
        /// </summary>
        /// <param name="name"></param>
        public void Messages(string name)  
        {
            Console.WriteLine("事件的发布者");
            Console.WriteLine(name);
            if (!string.IsNullOrWhiteSpace(name))
            {
             
                PublishEventMessage.Invoke(new Company()
                {
                    CompanyName="腾讯",
                    HRName="马云",
                    Message="招.net开发"

                    
                });
            }
        }
    }

 

  public class read
    {
        public void ReadMessages( EventArgs args)
        {
            var a = (Company)args;
            Console.WriteLine("HR姓名:"+a.HRName+",公司的名字:"+a.CompanyName+",司招聘信息:" + a.Message);
            Console.WriteLine("招聘者小王已经订阅此消息");
        }
    }

 

  static void Main(string[] args)
        {
            CommandClass model = new CommandClass();
            read reads = new read();
            model.PublishEventMessage += reads.ReadMessages;
            model.Messages("来招聘了");
        }

运行结果跟上面的dome是一样的。

 这里的dome写的很简单,本人资历有限,如果有写错的地方,欢迎指点,谢谢!!!

 

posted @ 2020-06-08 18:19  Eudora_荣  阅读(477)  评论(0)    收藏  举报