理解委托
委托是一种类型.委托像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(); }结果:
逆变可以将委托与具有某个类型的参数的方法一起使用.其中这些参数委托签名的基类型.
逆变允许方法具有的派生参数类型比委托类型中的更少.例:
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/>"); } }结果: