委托是引用类型,也可以自定义类型;
换个概念:A委托B去做一件事。站在A的角度,A委托了B,站在B的角度,B是A的代理。
C#语言中的委托比较抽象:委托指向一系列具有相同签名和返回类型的方法的地址。
总结:委托是一系列方法地址的引用,委托就代理了一系列的方法。调用委托就相当于调用这一系列方法。
使用delegate关键字
在类内部可以定义,在类外部也可以,在方法中不能定义
internal class Program
{
//定义委托,观察一下:委托和方法的形式的区别:a.没有方法体 b.多个delegate关键字。
//可以没有返回,可以没有参数。
public delegate void SayHello();
public delegate bool Delegate1(string arg);
}
方法:返回值类型 返回值变量 = 方法名(形参列表):
委托不能像方法那样直接调用,委托没有方法体,委托必须代理某个方法
委托实例名直接调用。如:
SayHello sayChinese = new SayHello(SayChinese);
sayChinese();
Inovke执行委托
如果委托定义没有参数,则Inovke也没有参数;委托没有返回值,则Inovke也没有返回值
BeginInvoke开启一个新线程执行委托
NetCore不支持,NetFamework支持 NetCore有更好的多线程功能来支持实现类似功能
EndInvoke等待BeginInvoke执行完成后再执行
通过new来实例化
public delegate void SayHello();
public delegate bool Delegate2(string arg);
static void Main(string[] args)
{
// a. 实例化(让某个委托类型去代理一系列方法地址) C# 1.0写法
SayHello sayHello1 = new SayHello(Method1);
// 实例化有一种简写,只要方法满足委托的,就可以直接赋值给委托
ayHello sayHello2 = Method2; // 推荐
sayHello1();//调用委托,相当于访问了Method1()
sayHello2();//调用委托,相当于访问了Method2()
}
public static void Method1()
{
Console.WriteLine("方法1");
}
public static void Method2()
{
Console.WriteLine("方法2");
}
直接=一个方法,这个是编译器提供的语法糖
static void Main(string[] args)
{
// 多播委托:一个委托实例,同时代理多个方法地址。
// 多播委托:
// 语法细节,第一次代理时,不能使用+=,第二次及之后,需要使用+=运算符重载。
// 注意调用时,执行顺序。
delegate = Method4;
//delegate = Method3;// 重新赋值,把原来值替换。不叫多播委托。
delegate -= Method4;
delegate += Method3;
// ......
}
public static bool Method3(string arg)
{
Console.WriteLine("方法3");
return arg == "hello";
}
public static bool Method4(string arg)
{
Console.WriteLine("方法4");
return true;
}
直接=一个匿名委托
static void Main(string[] args)
{
// 使用匿名委托进行实例化,匿名委托本质就是匿名方法(匿名函数:没有名称方法) C# 2.0 写法
Delegate2 delegate2 = Method3;// 代理非匿名方法
}
private static bool Method3(string arg)
{
throw new NotImplementedException();
}
直接=一个Lambda
public delegate string Delegate3(int a, int b);
internal class Program
{
static void Main(string[] args)
{
// 通过拉姆达实例化委托 C# 3.0 写法
Delegate3 delegate1 = Method5;
Delegate3 delegate2 = (int a, int b) =>
{
return (a - b).ToString();
};
}
public static string Method5(int a, int b)
{
return (a + b).ToString();
}
}
委托其实是将一个方法作为参数传递给另一个方法。(委托可以充当方法的回调函数的类型)
委托是方法的引用。(即委托是方法的代理)
委托可以引用多个方法。(如:多播委托)
常见委托:Action,Action
Action:public delegate void Action(); 表示是一个没有形参,且没有返回值的委托
Action
Func
Func
Predicate
委托是一系列方法的引用,调用委托时,可以同时执行多个方法。
多播委托,就是用一个委托代理多个方法,调用委托时,可以执行多个方法。
多播委托的本质是运算符重载 += 、 -=
多播委托好处:广播事件(多次绑定事件,或者说绑定多个事件)
语法细节,第一次代理时,不能使用+=,第二次及之后,需要使用+=运算符重载。注意调用时,执行顺序。