zoukankan      html  css  js  c++  java
  • 关于委托

     

    委托的实现机制和C++的函数指针完全相同。委托是安全的,是因为委托和其他所有的.NET成员一样,是一种类型,任何委托对象都是System. Delegate 的

    某个派生类的一个对象System. Delegate继承了System.Object

     代码

     定义一个输入两个int参数返回int类型的委托DelegateTest,定义个输入两个int返回int的方法GetSum,new一个DelegateTest的实例test,与方法GetSum绑定

    (委托类型GetSum 的输入输出类型必须和DelegateTest相同才能绑定),之后就能用test(1,3)来调用方法(其实是调用委托的Invoke()方法,test.Invoke(1,3)==test(1,3)),

           每个委托对象至少包含了一个指向某个方法的指针,该方法可以是实例方法,也可以是静态方法。委托实现了回调方法的机制,能够帮助设计更加简洁优美的面向对象程序。 

         委托调用静态方法和非静态方法的区别,在C#中静态方法由关键宇stati c 来定义, 静态方法可以通过类名来访问而不需要任何实例对象, 在静态方法中不能访问类型中任何非静态成员。而实例方法需要通过具体的实例对象来调用,可访问实例对象中的任何成员。当一个实例方法被调用时,需要通过实例对象来访问,可以想象,绑定一个实例方法到委托必须同时让委托得到实例方法的代码段和实例对象的信息,这样在委托被回调的时候才能成功地执行该实例方法。委托的结构中包含一个:_target 和一个metodPtr_target是一个指向目标实例的引用。当绑定一个实例方法给委托时,该参数会被设置为该方法所在类型的一个实例对象。而当绑定一个静态方法给委托时,该参数则会被设置为nullmetodPtr 是一个指向绑定方法代码段的指针,。绑定静态方法或实例方法在这个成员的设置上并没有不同。

    事实上,对于继承自System.MulticastDelegate的自定义委托类型来说,还有另外一个成员变量: _prey 该指针指向委托链中的下一个委托。

    链式委托:System.MulticastDelegate链式委托是指一个委托的链表,而不是指另一类特殊的委托。当执行链上的一个方法时,后续委托方法将会被依次执行。S ystem.Multi c as t Delegate 定义了对链式委托的支持。在System.Delegate的基础上,它增加了一个指向后续委托的指针,这样就实现了一个简单的链表结构。链式委托以通过Delegate[] h = handler.GetlnvocationList();活动当前实例方法之后的所有委托。

    如果委托的方法是包含返回值的,此时就需要手动调用委托链上的方法,

    foreach (Delegate d in _myDelegatel.GetlnvocationList () )

    {

    d. Dynamiclnvoke ()

    };


     using System;

    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    namespace 委托
    {
    class Program
    {
    public  delegate int DelegateTest(int a,int b);
    public delegate void DelegateTest2();
    static void Main(string[] args)
    {
    DelegateTest test=new DelegateTest (GetSum);
    Program p = new Program();
    DelegateTest test2 = new DelegateTest(p.GetSum2);
    DelegateTest2 test3 = new DelegateTest2(Method1);
    test3 += new DelegateTest2(Method2);
    test3 += new DelegateTest2(Method3);
    Delegate[] tttt=test3.GetInvocationList ();
    foreach (var t in tttt)
    {
    t.DynamicInvoke ();
    }
    Console.WriteLine(test.Invoke(1,3));
    Console.Write(test2.Invoke(1, 3));
    Console.Read();
    }
    static int GetSum(int a,int b)
    {
    return a + b;
    }
    int GetSum2(int a, int b)
    {
    return a + b;
    }
    static int GetSum3(int a, int b)
    {
    return a + b;
    }
    static void Method1()
    {
    Console.WriteLine("方法1");
    }
    static void Method2()
    {
    Console.WriteLine("方法2");
    }
    static void Method3()
    {
    Console.WriteLine("方法3");
    }
    }
    }

    委托的应用场合:通常是任务的执行者把细节工作进行再分配,执行者确切地知道什么工作将要被执行,但却把执行细节委托给其他组件、方法或者程序集。 

    以上内容只为方便自己记忆和理解,如有雷同或错误请包涵 

  • 相关阅读:
    leetCode 24. Swap Nodes in Pairs (双数交换节点) 解题思路和方法
    【jQuery 区别】.click()和$(document).on("click","指定的元素",function(){});的区别
    【前台 submit的重复提交 错误】submit的重复提交
    【spring 注解 错误】使用controller 作为后台给前台ajax交互数据出错
    【Filter 不登陆无法访问】web项目中写一个过滤器实现用户不登陆,直接给链接,无法进入页面的功能
    【Filter 页面重定向循环】写一个过滤器造成的页面重定向循环的问题
    【前台页面 BUG】回车按钮后,页面自动跳转
    【hibernate 执行方法未插入数据库】hibernate的save方法成功执行,但是未插入到数据库
    【maven 报错】maven项目执行maven install时报错Error assembling WAR: webxml attribute is required (or pre-existing WEB-INF/web.xml if executing in update mode)
    【hibernate criteria】hibernate中criteria的完整用法 转
  • 原文地址:https://www.cnblogs.com/dlz1123/p/1959645.html
Copyright © 2011-2022 走看看