12、c#委托+lambda表达式
·
1 委托
1.1 概念
delegate:托类似于函数指针,但更类型安全,是实现事件和回调机制的基础 dalegate:抽象方法的简化 实现把方法作为参数/变量进行传递
1.2 委托的定义和实现
/*
委托的使用 可以当成一种数据类型一样 只是赋值必须是格式和其一样的方法
委托类型可以当 成员变量+局部变量+方法参数列表
作用:可以让方法作为变量、参数 进行传递
*/
internal class Demo12_delegate和lambda表达式
{
//成员变量是委托类型
static Test02.hehe th;
static void Main(string[] args)
{
//创建子类对象 :调用对象的heeh方法
Test01Zi zi = new Test01Zi();
zi.hehe(1);
//使用委托赋值:::指定委托的实例::一个方法::方法要求 返回值类型一样 参数列表一样
//局部变量是委托
Test02.hehe t = hh;
t(1);
//使用委托
haha(t,11);
haha(hh, 11);
haha(new Demo12_delegate和lambda表达式().hhh,11);
//给委托赋值:
Test02.hehe tt = new Demo12_delegate和lambda表达式().hhh;
th = hh;
th(1);
}
public static void hh(int a) {
Console.WriteLine("a=");
}
public void hhh(int a)
{
Console.WriteLine("a=");
}
//参数列表是委托类型
public static void haha(Test02.hehe h,int aa) {
h(aa);
}
//返回值是委托类型
public static Test02.hehe h() {
return hh;
}
}
//使用:创建抽象类的子类
class Test01Zi : Test01 {
public override void hehe(int a) {
Console.WriteLine("子类实现抽象方法::hehe");
}
}
//定义一个抽象方法:必须写在抽象类中
abstract class Test01 {
public abstract void hehe(int a);
}
//定义委托:写在一个正常类中
class Test02 {
public delegate void hehe(int a);
}
1.3 委托练习
internal class Demo12_delegatel练习
{
//饲养员的工作方法:喂动物 动物运动
static void Work(Eat e,Sport s,string food,int hour) {
e(food);
s(hour);
}
static void Main(string[] args)
{
Work(DogEat,DogSport,"骨头",1);
//c#支持方法中定义方法::建议不要使用::只能被当前方法访问到
void PigEat(string name)
{
Console.WriteLine("猪:::正在进食::" + name);
}
void PigSport(int h)
{
Console.WriteLine("猪:::正在运动::抓老鼠" + h);
}
Work(PigEat, PigSport, "饲料", 1);
}
static void DogEat(string name) {
Console.WriteLine("狗:::正在进食::"+name);
}
static void DogSport(int h)
{
Console.WriteLine("狗:::正在运动::洗澡" + h);
}
delegate void Eat(string name);
delegate void Sport(int hour);
}
2 lambda表达式
2.1 概念
lambda表达式::实现抽象方法/委托的一种简写方式 格式:=>
2.2 抽象类或者接口中使用lambda(了解)
internal class Demo12_lambda表达式
{
static void Main(string[] args)
{
//注意:c#不支持 通过lambda创建抽象类的匿名子类或者接口的匿名实现类
}
}
// 定义接口
public interface ICalculator
{
int Calculate(int a, int b); // 抽象方法
}
//实现类中使用lambda表达式
public class Adder : ICalculator
{
public int Calculate(int a, int b) => a + b;
//不使用lambda::其实没省略太多
//public int Calculate(int a, int b) {
// return a + b;
// }
}
2.3 实现委托 使用lambda表达式
/*
lambda表达式::实现抽象方法/委托的一种简写方式
格式:=>
*/
internal class Demo12_lambda表达式01
{
//定义委托
delegate int hehe(int a, int b);
delegate void hehehe(int a, int b);
static void Main(string[] args)
{
//定义方法来实现委托
int hehe1(int aa,int bb) {
return aa + bb;
}
Demo12_lambda表达式01.hehe h1 = hehe1;
int n=h1(1,2);
//通过lambda实现委托
//lambda实现抽象方法的简化写法::匿名方法
//(int aa, int cc)是参数列表
//{ Console.WriteLine("aa=" + aa); return aa + cc; }是方法体
hehe h2 = (int aa, int cc) => {
Console.WriteLine("aa=" + aa);
return aa + cc;
};
h2(1,2);
//lambda简化1:参数列表的数据类型可以省略
h2 = (aa, cc) => {
Console.WriteLine("aa=" + aa);
return aa + cc;
};
//lambda简化2:如果方法体 只有一个语句 {}可以省略
hehehe h3 = (int a, int b) => {
Console.WriteLine(a + ":::" + b);
};
h3 = (int a, int b) => Console.WriteLine(a + ":::" + b);
//lambda简化3:如果方法体 只是return
h2 = (aa, cc) => aa+cc;
}
}
更多推荐

所有评论(0)