zoukankan      html  css  js  c++  java
  • C#基础: C#委托(代理)delegate

    C#基础: C#委托(代理)delegate

        代理实际上类似于C++中的函数指针,因为C#中不存在指针,所以用代理可以完成一些原来在C++中用函数指针完成的操作,例如传递一个类A的方法m给另一个类B的对象,使得类B的对象能够调用这个方法m。但与函数指针相比,delegate有许多函数指针不具备的优点。首先,函数指针只能指向静态函数,而delegate既可以引用静态函数,又可以引用非静态成员函数。在引用非静态成员函数时,delegate不但保存了对此函数入口指针的引用,而且还保存了调用此函数的类实例的引用。其次,与函数指针相比,delegate是面向对象、类型安全、可靠的受控(managed)对象。也就是说,runtime能够保证delegate指向一个有效的方法,你无须担心delegate会指向无效地址或者越界地址。

        实现一个delegate是很简单的,通过以下3个步骤即可实现一个delegate:
    1. 声明一个delegate对象,它应当与你想要传递的方法具有相同的参数和返回值类型。
        声明一个代理的例子:
        public delegate int MyDelegate(string message);

    2. 创建delegate对象,并将你想要传递的函数作为参数传入。
         创建代理对象的方法:
        1). MyDelegate myDelegate = new MyDelegate(实例名.方法名);
        2). MyDelegate myDelegate = new MyDelegate(类名.方法名);
    注:如果需要代理的方法是一个static静态方法的话,采用第2种方式,否则采用第1种方式。

    3. 在要实现异步调用的地方,通过上一步创建的对象来调用方法。
        可以直接使用代理调用代理所指向的方法:
        myDelegate(向方法传递的参数);

        下面是一些需要注意的事情:
    “代理”(delegate)(代表、委托):“代理”是类型安全的并且完全面向对象的。
    (1)在C#中,所有的代理都是从System.Delegate类派生的(delegate是System.Delegate的别名)。
    (2)代理隐含具有sealed属性,即不能用来派生新的类型。
    (3)代理最大的作用就是为类的事件绑定事件处理程序。
    (4)在通过代理调用函数前,必须先检查代理是否为空(null),若非空,才能调用函数。(5)在代理实例中可以封装静态的方法也可以封装实例方法。
    (6)在创建代理实例时,需要传递将要映射的方法或其他代理实例以指明代理将要封装的函数原型(.NET中称为方法签名:signature)。注意,如果映射的是静态方法,传递的参数应该是类名.方法名,如果映射的是实例方法,传递的参数应该是实例名.方法名。
    (7)只有当两个代理实例所映射的方法以及该方法所属的对象都相同时,才认为它们是想等的(从函数地址考虑)。
    (8)多个代理实例可以形成一个代理链,System.Delegate中定义了用来维护代理链的静态方法Combion,Remove,分别向代理链中添加代理实例和删除代理实例。
    (9)代理三步曲:
       a.生成自定义代理类:delegate int MyDelegate();
       b.然后实例化代理类:MyDelegate d = new MyDelegate(MyClass.MyMethod);
       c.最后通过实例对象调用方法:int ret = d();

    给一个委托的例子:
    页面上2个文本输入框,一个按钮,现在用委托来实现两个文本框的数字相乘

    public delegate double mygate(int one,int two);//定义一个委托

    public double newGate(int int1, int int2)//定义一个方当实现两个数字积
    {
       return int1 * int2;
    }

    protected void btnDelegate_Click(object sender, EventArgs e)
    {
       mygate objdelegate = new mygate(newGate);//初始化委托实例
       double newValue = objdelegate(Convert.ToInt32(TextBox1.Text), Convert.ToInt32(TextBox2.Text));
       labDouble.Text = newValue.ToString();
    }


    委托就是函数指针,类似于策略设计模式,可以实现算法的动态替换。

  • 相关阅读:
    offsetLeft,Left,clientLeft的区别
    IIS 内部运行机制
    常用正则表达式
    千万不要把 bool 设计成函数参数
    ASP.NET第一课,IIS安装与配置
    将字符串转为变量名(C#)
    淘宝技术发展
    C# 反射机制
    技术普及帖:你刚才在淘宝上买了一件东西
    高性能分布式计算与存储系统设计概要——暨2012年工作3年半总结
  • 原文地址:https://www.cnblogs.com/netserver/p/1593400.html
Copyright © 2011-2022 走看看