委托
概念
1.存储函数引用的类型,是一种用户自定义的类型
2.委托储存具有相同返回类型和相同参数的任何类或结构
用处:如:发布订阅模式,事件等。
与类的区别
同:都是一种用户自定的类型
异:
类:表示的是数据和方法的集合
委托:持有一个或多个方法,以及一系列预定义操作,没有方法主体
声明
关键字:delegate
委托类型必须在被用来创建变量以及类型的对象之前声明
delegate void MyDel(int x);
实例
namespace Func
{
public delegate void MyDel();//声明一个自定义委托
class Program
{
static void Main(string[] args)
{
MyDel say1 = SayHi;
MyDel say2 = new MyDel(SayHi);
say1();
say2();
}
static void SayHi()
{
Console.WriteLine("hi");
}
}
}
扩展实例
namespace Func
{
public delegate int MyDel(int num);//声明一个自定义委托0
class Program
{
static int Add1(int a)
{
int b = 10 + a;
Console.WriteLine("——Add1———");
return b;
}
static int Add2(int a)
{
int b = 10 - a;
Console.WriteLine("——Add2———");
return b;
}
static void Calculate(MyDel ex, int a)
{
var result = ex(a);
Console.WriteLine(result + "\n");
}
static void Main(string[] args)
{
Calculate(Add1, 1);
Calculate(Add2, 10);
Console.ReadKey();
}
}
}
结果如下图
组合委托
可以使用额外的运算符来"组合"。如:+=,+等
移除可使用-=等
实例
namespace Func
{
public delegate int MyDel(int num);
class Program
{
static int MyInstaObj(int num) {
Console.WriteLine("MyInstaObj");
return num;
}
static int SClass(int num)
{
Console.WriteLine("SClass");
return num;
}
static void Main(string[] args)
{
MyDel dela = MyInstaObj;
MyDel delb = SClass;
MyDel delc = dela + delb;
int d = delc(1);
Console.WriteLine("d=========" + d + "=============");
//或使用+=
MyDel delD = MyInstaObj;
delD += SClass;
int d2 = delD(2);
Console.WriteLine("d2=========" + d2 + "============");
//使用-=移除
delD -= SClass;
int d3 = delD(3);
Console.WriteLine("d3=========" + d3 + "============");
Console.ReadKey();
}
}
}
运算结果
匿名方法
1.在初始化委托时内联声明方法
2.不会显式声明返回类型
3.参数类型,数量,修饰符必须和委托匹配
4.匿名方法可以访问它们外围作用域的局部变量和环境
实例
namespace Func
{
public delegate int OtherDel(int inParam);
class Program
{
static void Main(string[] args)
{
OtherDel del = delegate (int x)
{
return x + 20;
};
}
}
}
Lambda表达式
1.删除delegate关键字
2.在参数列表和方法主体之间放=>运算符
实例
namespace Func
{
public delegate int OtherDel(int inParam);
class Program
{
static void Main(string[] args)
{
OtherDel del = (int x) => {return x + 20;};
//或
OtherDel del = x => x + 20; //只有一个参数,可以省略圆括号
}
}
}