委托
委托的发展
在 C# 1.0 中,通过使用在代码中其他位置定义的方法显式初始化委托来创建委托的实例。 C# 2.0 引入了匿名方法的概念,作为一种编写可在委托调用中执行的未命名内联语句块的方式。 C# 3.0 引入了 lambda 表达式,这种表达式与匿名方法的概念类似,但更具表现力并且更简练。
概念
委托是一种类型,属于引用类型,委托的关键字是delegate,委托的定义和类的定义一样,所以能定义类的地方都可以定义委托;委托不仅能够调用实例方法,也能调用静态方法
声明委托
[修饰符] delegate <函数返回类型> <委托名> (<函数参数>)
匿名委托
由于使用匿名方法无需创建单独的方法,因此可减少对委托进行实例化的编码开销
实例化委托
<委托类型> <实例化名>=new <委托类型>(<注册函数>) 或 <委托类型> <实例化名>=<注册函数>
类型安全
所谓类型安全,是指编译器在编译时就能确定委托的参数类型和返回值类型
示例代码
语法糖
通过Lambda表达式实现(C#3.0中引入),也是匿名委托
示例代码
匿名委托传参
只有一个参数时,只需一个变量即可;没有参数或多个参数应放在小括号中(没有参数则小括号内为空)(Lambda表达式)
委托和Lambda
1、Lambda 包含的参数数量必须与委托类型包含的参数数量相同;2、Lambda 中的每个输入参数必须都能够隐式转换为其对应的委托参数;3、Lambda 的返回值(如果有)必须能够隐式转换为委托的返回类型
逆变
父类转换为子类(允许方法的参数是委托签名中对应位置上参数的基类)
协变
子类转换为父类(允许方法的返回类型是委托签名中定义的返回类型的继承类)
委托多播性
<委托类型> <实例化名>+[或-]=new <委托类型>(<注册函数>) 或 <委托类型> <实例化名>+[或-]=<注册函数>