C#的基础琐碎总结-----委托
1、委托:其实就是方法的多态,可以更确切的说是方法的指针
2、委托是引用类型,这与类和接口相似。
3、一个委托可以指向多个方法,方法的签名相同,委托才能指向它
4、接口只能一次可以指向一个实例,而委托可以指向多个方法;此刻调用一个委托可以调用多个方法,也即是委托链
5、使用委托的步骤:
步骤1:声明委托
1定义委托:可访问性 delegate 返回类型 (参数列表);
2定义方法:可访问性 返回类型 (参数列表)
//以上两点根据参数类型和返回类型进行匹配,必须两者相同才能委托指向方法,也即函数的签名必须相同
public delegate void Job();
注意:其实委托相当于一个类所以定义委托一定要定义在方法的外面。
步骤2:创建委托调用的方法
//创建一个类,里面包含两个方法
class School
{
public void teacher()
{
Console.WriteLine("老师的工作是教学生学习!");
}
public void student()
{
Console.WriteLine("学生的工作是好好学习!");
}
}
步骤3:调用委托进而调用指向的方法
static void Main(string[] args)
{
School school = new School();
Job j = new Job(school.teacher); //实例化委托的时候必须指明其构造函数的参数,该参数不是值,不是引用,而是要指向方法的方法名
j += new Job(school.student); //继续加入委托链,其实相当于加入到委托数组里面,就像是一个方法数组,即数组里面存储了多个方法
Console.WriteLine("此刻该委托链中有{0}个方法",j.GetInvocationList().Length);
// j.GetInvocationList().Length调用委托的一个方法获取委托数组的长度,也即获得委托方法的个数。
j();
j -= new Job(school.student); //当然也可以从委托链中减去相应不想用的方法
Console.WriteLine("此刻该委托链中有{0}个方法", j.GetInvocationList().Length);
j();
}
5、委托的广播
使用+=委托中添加一个方法,使用- =使委托中减少一个方法,其实委托链就存在一个委托数组中,数组中存的是方法的引用。+=相当于添加一个委托的引用,-=相当于减少一个委托的引用。
单路广播:一个委托指向一个方法
多路广播:一个委托指向多个方法
注意:对于单路广播可以使用返回值,而对于多路广播,方法的返回值可能就不知一个,所以一般不建议带返回值,若必须有那么委托接收的是委托链最后的那个方法的返回值。
6、委托类的成员
以下方法可以简单的了解下,是用编程的方式实现委托的创建,添加委托的方法,减去等。
7、委托增强
1、匿名方法:字面上讲没有名字的方法,能省略参数列表,意味着可以将匿名方法转换为带有各种签名的委托。可以把代码块传递作为委托的参数,而这个代码块还是相当于原来类里面的一个方法。好处:通过匿名方法不必创建单独的一个方法,创建类,减少了实例化委托所需要的代码系统开销。
如:使用匿名方法实现老师工作的方法。
Job jobdelegate = delegate()
{
Console.WriteLine("老师的工作是教学生学习!"); };
jobdelegate();//使用该委托
仅仅使用一次的方法一般不要写在类里面,避免冗余,再如来个数相加:
public delegate int Add(int a, int b);//定义委托
Add add = delegate(int m, int n)
{
return m + n;
};
int result=add(1,2);
Console.WriteLine(result);
8、协变和逆变
协变和逆变都是与继承有关系的
(1)协变:允许方法具有的派生返回类型比委托中定义的多,比如说:
定义两个类,男人继承于人类:class people{}; class men:people{};
定义委托:public delegate people MethodPeople();
委托可以返回people,也可以返回men;即 MethodPeople m1=delegate(){return man;};
可以这么简单的理解:委托类型是父类类型,而委托调用方法时方法返回类型可以使子类类型,当然也可以是父类类型。
(2)逆变:允许方法具有派生类参数类型比委托类型中的更少
字面上就能理解是和逆变相反的,说白了就是委托定义的子类类型或者参数为子类类型,而返回的可以使父类类型,或者参数传入的时父类类型。
个人理解:其实这就是方法返回类型和方法参数的多态,仅做参考。
协变和逆变用的地方不是很多,简单了解就行。