对于委托的初步认识
委托的定义:
委托是一种引用方法的类型,一旦为委托分配了方法,委托将与该方法具有相同的行为,委托方法的使用和其他方法一样,具有参数和返回值
通俗的讲:将方法作为方法的参数
注意:.委托定义的时候和类位于同一个级别。
2委托的定义语法:访问修饰符(public、private和protected等)delegate 方法签名(方法的名字,没有方法体);
方法签名:指定的是方法名称和参数,不包含返回值类型
eg. public delegate int AddMethod(int x,int y);//该委托的返回值类型为int,但是,一般情况下 最好定义为viod
3.
3.使用委托实现各个国家人的问好功能来看怎样使用委托。
使用委托分为三个步骤:1,定义委托 2.声明委托变量 3.使用委托
重点:委托有多种调用方式,无论使用哪种方式,最终都会创建出一个委托对象(查看源码)。
namespace chp201委托初步 {
//01.定义一个委托
public delegate void FirstDel(string name); //可以在不带参数或参数列表的情况下声明委托
class Program
{
static void Main(string[] args)
{
//002.声明一个委托变量
FirstDel mydel = Chinese;
mydel("李小龙");
//注意:第一次用的“=”,是赋值的语法;第二次,用的是“+=”,是绑定的语法。如果第一次就使用“+=”,将出现“使用了未赋值的局部变量”的编译错误。
//但是代码可以这样写:
//GreetingDelegate delegate1 = new GreetingDelegate(); //delegate1 += EnglishGreeting; // 这次用的是 “+=”,绑定语法。 //delegate1 += ChineseGreeting; // 给此委托变量再绑定一个方法
mydel += English;
//既然给委托可以绑定一个方法,那么也应该有办法取消对方法的绑定,很容易想到,这个语法是“-=”:
mydel -= Chinese;
//003.调用委托
mydel("JENG");
Console.ReadKey();
}
static void Chinese(string myname)
{
Console.WriteLine("你好"+myname);
}
static void English(string aa)
{
Console.WriteLine(aa + ",Good morning.");
}
}
输出的结果是
你好李小龙
JENG,Good morning
由此我们可以总结:1委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性。
2.使用委托可以将多个方法绑定到同一个委托变量,当调用此变量时(这里用“调用”这个词,是因为此变量代表一个方法),可以依次调用所有绑定的方法。
另外:我们要知道自定的委托时继承多播委托,多播委托继承与委托
多播委托的概念:委托也可以包含多个方法。
如果调用多播委托,就可以按顺序连续调用多个方法。为此,委托的签名就必须返回 void (否则,返回值应送到何处?否则会抛出run-time exception)(当委托只包含一个方法的时候,其返回类型的声明可以参照所封装的方法,不一定必须是void)。实际上,如果编译器发现某个委托返回 void ,就会自动假定这是一个多播委托。
多播委托的缺点:当你已经挂载多个方法时,当你后面出现另一个方法挂载,用=,而不是+=时,前面加载的所有方法链全部断裂,只保留你最后挂载的方法。所以后来才有了事件。(注意:事件是一个私有的委托加上公有的Add()和Remove()方法,通俗的说,事件是对委托的封装,事件的作用只是为了约束一个委托对象的操作方法,对外通过+=进行挂载,-=进行取消挂载,不能通过=挂载,否则报错)。
补充知识:事件的定义方式:public event 委托的定义类型 事件名;
上面所写的各国人打招呼就是一个多播委托。
委托的优点: (1)压缩方法的调用。
(2)合理有效地使用委托能提升应用程序的性能。
(3)用于调用匿名方法。
说道这里我们提一下匿名类:匿名方法没有名称,编译器会定指定一个名称,匿名方法中不能使用跳转语句跳转到该匿名方法的外部,也不能跳转到该方法的内部。也不能在匿名方法外部使用的ref和out参数。
匿名方法的作用:因此减少了实例化委托所需的编码系统开销。
什么时候该使用匿名方法
1.需要一个临时方法,该方法使用次数极少;
2.这个方法的代码很短,甚至可能比方法声明都短的情况下使用。
匿名方法的特点: 1、 匿名方法只存在方法,但没有名字
2、 委托有一种桥接的概念,而匿名方法就是要将这个桥接简化。换句话说:匿名方法允许我们以一种“内联”的方式来编写方法代码,将代码直接与委托实例相关联,从而使得委托实例化的工作更加直观和方便
3、 匿名方法直接与委托实例相关联
匿名方法的定义
MyDel del = delegate() { 方法体 };// MyDel是定义的委托名称
看如下代码:
1、 参数列表,看如下代码:
static void Main(string[] args)
{
MyDelegate MyDele = delegate(int i) { Console.WriteLine("hello KiddLee"); };
}
delegate void MyDelegate(int i);
匿名方法可以在delegate关键字后跟一个参数列表(可以不指定),后面的代码块则可以访问这些参数,如果不指定的话也是可以的,如下代码编译时也可以通过。
static void Main(string[] args)
{
MyDelegate MyDele = delegate{ Console.WriteLine("hello KiddLee"); };
}
delegate void MyDelegate(int i);
注意:不指定参数列表和参数列表为空是不一样的,如下
//不指定参数列表,对于MyDelegate来说这种情况是正确的
MyDelegate MyDele = delegate{ Console.WriteLine("hello KiddLee"); };
//参数列表为空,对于MyDelegate来说这种情况是错误的
MyDelegate MyDele = delegate(){ Console.WriteLine("hello KiddLee"); };
2、 匿名方法的返回值
如果委托类型的返回值类型为void,匿名方法里不能返回任何值
delegate void MyDelegate();
static void Main(string[] args)
{
MyDelegate mydele = delegate
{
return;
};
}
但是如果委托类型的返回值类型不为void,匿名方法返回值也不能为void
delegate int MyDelegate();
static void Main(string[] args)
{
MyDelegate mydele = delegate
{
return 100;
};
}
以上是我对于匿名类和委托的浅理解。请各位大神有更好的,可以指导指导我,谢谢