zoukankan      html  css  js  c++  java
  • 事件的那些事儿

    事件说白了就是委托,一种特殊的委托。

    事件我们可以理解成:消费者向服务者提出服务的方式,然后服务者根据消费者提出的方式去执行服务,比如餐馆与食客。

    建立事件的要素

    1.声明一个委托(饭店经营的执照):

    public delegate void myDelegate(Custom sender);

    2.定义一个提供事件服务的类,里面包含了事件的定义、调用事件执行的方法,当然也可以包含事件委托。

     2.1声明一个改委托类型的事件(饭店里的厨子):

    public event myDelegate  myEvent;

     2.2 定义事件执行的方法(厨子做饭)

    public void Run(object sender)
           {
               myServer(sender);
           }

    3.定义一个使用时间的消费者类,里面包含了 将事件和消费事件方法绑定、消费事件方法的定义
    3.1 自身的事件方法和服务类事件挂钩(厨子和执照的对应,没有执照不让开厨子做生意):

    public void Customer(Server se)
            {
                se.myServer+=new Server.myDelegate(this.myCus);
            }

    3.2消费事件方法(客人提出自己想吃什么,这饭怎么做)

    public void myCus(object cs)
            {
                Console.WriteLine(cs.ToString()+"是消费事件方法");
            }

    4主函数中对事件本身触发的使用(主函数相当于饭馆的饭桌):

    4.1调用Customer方法(客人来了提出自己想吃什么)

    4.2.调用服务类事件执行方法(厨师去按照客人的吩咐做饭)

    总览:

    class Server
        {
           public delegate void myDelegate(object sender);
           public event myDelegate  myServer;
           public void Run(object sender)
           {
               myServer(sender);
           }
        }
        class Custom
        {
            
            public void Customer(Server se)
            {
                
                se.myServer+=new Server.myDelegate(this.myCus);
            }
            public void myCus(object cs)
            {
                Console.WriteLine(cs.ToString()+"是消费事件方法");
            }
        }
       
        public class Event
        {
            static void Main()
            {
                
                Server server = new Server();            
                Customer cs = new Customer();
                cs.Customer(server);
                server.Run(new Event());
                Console.ReadKey();
            }
    
          }

    一些扩展:

    1.在以上的代码中的

    server.Run(new Event())

    new Event() 这个参数可以变换,因为当初设定服务类中事件运行方法和委托的时候参数是 object类型,所以这里可以是各种对象。这就使委托变得形式多样化。

    2.声明委托的时候,也可以独立在类之外,但是参数类型就只能是object,而不是前面提到的Custom,因为委托面向的范围层级不一样。限定具体类类型的委托需包含于类中。看代码:

    namespace Test
    {
        public delegate void myDelegate(object sender);
        class Server
        {
           public event myDelegate  myServer;
           public void run(object sender)
           {
               myServer(sender);
           }
        }
        class Custom
        {
            public void myCus(object cs)
            {
                Console.WriteLine(cs.ToString()+"什么");
            }
        }
       
        public class Event
        {
            static void Main()
            {
                
                Server server = new Server();
                server.myServer += new myDelegate(new Custom().myCus);
                Custom sc = new Custom();
                server.run(sc);
                Console.ReadKey();
            }
    
            static void server_myServer(object sender)
            {
                Console.WriteLine(sender.ToString());
                Console.WriteLine(123);
            }
           
        }
     }
  • 相关阅读:
    批量给对象属性赋值
    判断linq语句结果是否为空的方法
    linq var出来的object取值问题
    LinQ转换运算符OfType<T>
    C#退出的几种方式
    return的用法
    扩展文字
    Timer的使用方法
    通过16道练习学习Linq和Lambda
    VS2010 无可用源
  • 原文地址:https://www.cnblogs.com/JhoneLee/p/3076092.html
Copyright © 2011-2022 走看看