zoukankan      html  css  js  c++  java
  • 委托和事件

    委托和事件

    委托和事件

    这两天重新温习了一下关于委托和事件方面的知识,总结一下。

    一.委托

    委托就是能够将方法作为变量来传递。

    C#中使用委托的具体步骤是:

    (1)委托的声明。其参数形式一定要和想要包含的方法的参数形式一致。委托可以在程序运行时调用不同的方法,只要这个方法签名和委托签名保持一致。

    格式:

    [修饰符]  delegate  返回类型   委托号(参数列表)

    例如:  

     public delegate void MyDelegate1(string input);//无返回值 有参数
    public delegate double MyDelegate2();//无参数

    声明一个委托的对象,与声明一个普通类对象的方式一样。

     MyClass1 cls = new MyClass1();
                MyDelegate1 d1;
     d1 = new MyDelegate1(cls.dMethod1);
     MyDelegate1 d2 = new MyDelegate1(d1);
     MyDelegate2 d3 = new MyDelegate2(cls.dMethod3);

    委托名    委托对象;

    (2)定义所有要定义的方法,其参数形式和第一步中声明的委托对象的参数形式必须相同。

    定义委托相对应的方法:

    复制代码
           public void dMethod1(string input)
            {
                Console.WriteLine("Method1传递的参数是{0}",input);
            }
            public void dMethod2(string input)
            {
                Console.WriteLine("Method2传递的参数是{0}",input);
            }
            public double dMethod3()
            {
                Console.WriteLine("Method3没有传递的参数");
                return 43.33;
            }
    复制代码

    (3)创建委托对象(将上面写的方法包含其中)

    View Code
    1 MyClass1 cls=new MyClass();  //实例化对象
    2 
    3 MyDelegate d1=new MyDelegate(cls.dMethod1);
    4 
    5 MyDelegate d2=new MyDelegate(cls.dMethod2);
    6 
    7 MyDelegate d3=new MyDelegate(cls.dMethod3);

    (4)通过委托对象调用包含在其中的方法

    d1("你好");
    d2("生活着,学习着!");
    double dbTemp=d3();

    详细实例:

    复制代码
    class MyClass1
        {
            public void dMethod1(string input)
            {
                Console.WriteLine("Method1传递的参数是{0}",input);
            }
            public void dMethod2(string input)
            {
                Console.WriteLine("Method2传递的参数是{0}",input);
            }
            public double dMethod3()
            {
                Console.WriteLine("Method3没有传递的参数");
                return 43.33;
            }
        }
    
    
     class Program
        {
            public delegate void MyDelegate1(string input);
            public delegate double MyDelegate2();
            static void Main(string[] args)
            {
                MyClass1 cls = new MyClass1();
                MyDelegate1 d1;
                d1 = new MyDelegate1(cls.dMethod1);
                d1("3");
                MyDelegate1 d2 = new MyDelegate1(d1);
                d1("daaa");
                d2("dafagd");
                MyDelegate2 d3 = new MyDelegate2(cls.dMethod3);
                d3();
                //委托对象可以封装多个方法,这些方法的集合称为调用列表,使用 + 、+-、 -、 -=
                //运算符向调用列表中增加或移除方法
                MyDelegate1 d4 = d1 + d2;
                d4("1234");
                double dbTemp = d3();
                Console.WriteLine(dbTemp);
                Console.ReadLine();
            }
        }
    复制代码

    二.事件

    (1)事件的声明

    事件是类成员,以关键字event声明。

    格式:

    [修饰符]  event 委托名 事件名;

    所有的事件是通过委托来激活的,其返回值类型一般是void型

    例子: delegate void MyEventHandler();

    复制代码
    class MyEvent
    
    {
    
      public event MyEventHander active;//active就是一个事件名
    
    }
    复制代码

    (2)事件的预定与取消

    事件的预定就是向委托的调用列表中添加方法,是通过事件加上运算符+=来实现的。

    格式:

    事件名+=new 委托名(方法名);

    例如:

    MyEvent evt=new MyEvent();
    evt.active+=new EventHandler(handler);

    在winform窗体中

    OkButton.Click+=new EventHandler(OkButton.Click);

    只要事件被触发,所预定的方法就会被调用。

    事件的取消

    格式:

    事件名 -=new 委托名(方法名);

    OkButton.Click-=new EventHandler(OkButton.Click);

    对于事件的操作只能使用+=和-=这两种运算符。

    (3)事件的发生

     事件的发生就是对事件相对应的委托的调用,也就是委托的调用列表中包含的各个方法的调用。

    格式:

    事件名(参数);

     详细实例:

    复制代码
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace _02委托和事件01
    {
        class Program
        {
            delegate void MyEventHandler();//为事件建立一个委托
            class MyEvent
            {
                public event MyEventHandler activate;//声明一个事件
                public void Fire()//调用此方法来触发事件
                {
                    if (activate != null)
                    {
                        activate();//事件发生
                    }
                }
            }
            static void Handler()
            {
                Console.WriteLine("事件发生");
            }
            static void Main(string[] args)
            {
                MyEvent evt = new MyEvent();
                evt.activate += new MyEventHandler(Handler);//将方法Handler()添加到事件列表中
                evt.Fire();//调用触发事件的方法
                Console.ReadLine();
            }
        }
    }
    复制代码

    委托的常用格式:

    Delegate void 委托名(object  sender,EventArgs  e);

    总结一下:委托是一个引用方法的对象,当创建一个委托,也就建立了一个引用方法的对象,进而就可以调用那个方法,即委托可以调用它所预定的方法。委托是对方法的抽象,它将方法的调用与实现分离,方法的调用者(即委托的执行者)不知道方法的内部如何实现,而方法的实现者也不知道什么时候被调用,委托理所当然成为实现事件的机制。

    错误或者不当之处望各位大神指点

  • 相关阅读:
    js 表格上下移动 javascript实现
    存储过程-----DECLARE---实用注意事项
    储存过程-原理、语法、函数详细说明
    第九章 接口
    第八章 多态
    第七章 类复用
    synchronized ---- 作用
    集合框架综述
    java static代码块执行时机
    状态模式
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/2943474.html
Copyright © 2011-2022 走看看