zoukankan      html  css  js  c++  java
  • 理解委托

    委托是一种类型.委托像String,像Integer,像我们定义的Class一样,是一种类中.

    委托是一种引用方法的类型.与委托的签名(参数和返回值)匹配的方法都可以分配给该委托.方法可以是静态方法,也可以是实例方法.

    一旦为委托分配了方法,委托将与该方法具有相同的行为.委托方法的调用可以像其他方法一样,具有参数和返回值.

    使用委托,可以将多个方法绑定到同一个委托变量.当调用此变量时,可以依此调用所绑定的方法.

    注意:

    在方法重载的上下文中,方法的签名不包括返回值,但是在委托的上下文中,签名包括参数和返回值.

    委托的特点:

    1.委托类似于方法指针.

    2.委托允许将方法作为参数进行传递

    3.委托可用于方法回调.

    4.委托可以链接在一起.

    5.方法不必与委托签名完全相同

    6.可以将匿名函数作为参数传递.

    注意,我们在上面提到,与委托签名匹配的方法都可以分配给该委托,而不是说与委托签名相同的方法都可以分配给该委托. 

    对于第5个特点,我们来看:委托中的协变和逆变

    协变可以将委托与具有返回类型的方法一起使用,其中这些返回类型继承自委托的返回类型.

    协变允许方法具有的派生返回类型比委托中定义的更多.

    例:

    public class Anmail
    {    
        
    }
    
    public class Cat : Anmail
    {
        public static Cat GetCat()
        {
            HttpContext.Current.Response.Write("Get a cat!<br/>");
            return new Cat();
        }
    }
    public class Dog : Anmail
    {
        public static Dog GetDog()
        {
            HttpContext.Current.Response.Write("Get a dog!<br/>");
            return new Dog();
        }
    }
    
    public delegate Anmail GetAnmails();
    
    protected void Page_Load(object sender, EventArgs e)
    {
        GetAnmails get = new GetAnmails(Cat.GetCat);
        get += Dog.GetDog;
        get();
    }

    结果:

    image

    逆变可以将委托与具有某个类型的参数的方法一起使用.其中这些参数委托签名的基类型.

    逆变允许方法具有的派生参数类型比委托类型中的更少.例:

    public class Anmail
    {
        public string Name { get; set; }
    }
    
    public class Cat : Anmail
    {
    
    }
    public class Dog : Anmail
    {
    
    }
    
    public delegate void GetAnmails(Anmail an);
    
    someclass
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            Cat c = new Cat() { Name = "Cat" };
            Dog g = new Dog() { Name = "Dog" };
    
            GetAnmails get = new GetAnmails(GetName);
            get(c);
            get(g);
        }
    
        public void GetName(Anmail an)
        {
            Response.Write(an.Name + "<br/>");
        }
    }

    结果:

    image

  • 相关阅读:
    排序算法
    彩票随机6+1,开发实例
    synchronized关键字以及对象锁和类锁的区别
    shell基础
    easyui+Spring MVC+hibernate = 乐途
    easyui + jdbc 实现简单的数据库管理。
    js map
    struts2 using kindeditor upload pictures (including jmagic compressed images)
    easyui filebox 浏览图片
    easyui datagrid to excel
  • 原文地址:https://www.cnblogs.com/loveYN/p/4509660.html
Copyright © 2011-2022 走看看