理解委托

委托是一种类型.委托像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

posted @ 2015-05-17 14:26  海绵宝  阅读(246)  评论(0编辑  收藏  举报