什么是委托
委托是方法的代理,委托的是方法,当调用委托时就是调用了这个方法.
委托是一类行为的抽象。
当调用委托时就是调用了这个方法。
【委托能存储方法的地址{引用}】【间接调用】(没有直接调用好 但是灵活)
委托的定义:委托是一种数据类型(声明了返回类型和参数组成的数据类型);
委托代表的是方法,【代表和委托签名一样的任何方法】
当调用委托时就是调用了这个方法。
签名
有时 返回类型和参数组成【委托】
有时 方法名和参数组成【隐藏】
有时方法名和参数组成 返回类型【重写】
为啥用委托
软件中:委托可以实现对方法的【间接】调用! 灵活=维护性好
委托的使用【基本步骤】 3步!!
步骤1【定义端】:定义委托
delegate 返回值 方法签名;
例如:delegate void Handler(); 习惯命名:SelectHandler
步骤2【调用端】:创建实例
【实例化委托:为委托指定{绑定}方法,只有方法名不用写括号】
步骤3【调用端】:调用委托【和调方法相似,有参数就要写参数,有返回值可以返回】
namespace 委托
{
//创建委托
delegate void PrintHandle();
delegate int CalHandle(int x ,int c );
class 委托
{
static void Main(string[] args)
{
//绑定委托
PrintHandle print = new PrintHandle(new F().F1);
CalHandle cal = new CalHandle(F.F2);
//调用委托
print();
cal(2,3);
}
}
class F
{
public void F1()
{
Console.WriteLine("委托");
}
static public int F2(int item,int item01)
{
return item + item01;
}
}
}
委托的分类 调用【使用】方式
1单播委托:一个委托对象只关联一个方法
2多播执行:一个委托对象关联多个方法 只返回最后方法的结果
所以:委托有返回值不适合多播执行!委托无返回值适合多播执行!
实例化委托多种写法
委托的使用步骤:三步 1:定义2:实例化委托(多种写法) 3:调用委托
1.方式一:基本传统标准的写法 上面写的就是的
2.方式二
PrintHandle print = new PrintHandle(new F().F1);
PrintHandle print =new F().F1简化的写法 等号右边 表示的是委托对象
3.方式三:匿名方法,适合于:
功能简单少量代码可以完成,且该功能不需要在其它地方复用.
Handler handler = delegate(int a) 等号右边 表示的是委托对象=匿名方法
{
for (int i = 0; i < a; i++)
Console.WriteLine(“HAHA”);
};
**方式四:Lambda 表达式,**适合于:
写法一:功能简单少量代码可以完成,且该功能不需要在其它地方复用
写法二:功能代码超简单,一行代码可以完成
Lambda 表达式语法:
委托类型 委托对象名=Lambda 表达式;
写法一 (参数)=>{语句} => goto
(参数1,参数2)=> 一行代码;
简化写法二 (只有一个参数和一句话) 一个参数=>一行代码;return不能写有返回值也不写
Handler handler = § => Console.WriteLine(p + “HAHA”);
等号右边 表示的是委托对象=Lambda 表达式=匿名方法
namespace 委托
{
//创建委托
delegate void PrintHandle();
delegate int ItemHandle(int a);
delegate int CalHandle(int x ,int c );
class 委托
{
static void Main()
{
//实例化委托多种写法
//第一种
PrintHandle printHandle = new PrintHandle(F.F1);
//第二种
CalHandle calHandle = F.F2;
//第三种匿名
CalHandle cal = delegate (int a, int b)
{
return a * b;
};
//第四种lamber表达式
CalHandle handle = (int a, int b) => { return 66; };
//要不要int都行
CalHandle handle = (a,b) => { int c = a + b + b; return c; };
CalHandle handle = (a,b) => { return 66; };
//如果后面只有一句话可以写成
handle += (int a, int b) => 66;
//如果一个参数一句可以写成
ItemHandle itemHandle = b=> b;
}
}
class F
{
static public void F1()
{
Console.WriteLine("委托");
}
static public int F11(int a)
{
return a;
}
static public int F2(int item,int item01)
{
return item + item01;
}
static public int F3(int item, int item01)
{
return item - item01;
}
}
}
委托的作用 用途 实际应用!
- 将方法做为参数传递,可以将一个方法的执行代码注入到另一个方法中
举个例子 list.Find()的方法就是要自己写方法
2定义算法/方法时 :
有的语句/步骤能定下来,有的暂时定不下来
可以使用委托表示确定不下来的
调用时再确定 把有些功能推迟到客户端【调用端】确定! - 实现回调,实现的方式比接口更灵活
回调
含义 1 方法 系统调用的 【不是程序员直接调用的】
含义 2 这里的含义
定义方法 有些定义时确定不下来,留给客户端确定
调用时候,从 调用端 到定义端
回到调用端 再到定义端执行 【灵活性】
回到调用端,结束
1》 接口可以作为方法的参数!
2》 委托可以作为方法的参数!
3》 有何不同?委托可以实现回调,作为参数,比接口更灵活 - 事件实现的基础
- 实现任意方法的异步调用。