C# 委托(delegate)、泛型委托和Lambda表达式

  • 2019 年 10 月 3 日
  • 笔记

# ?????

1???????????????????????????
2???????????????????????????????????????????????????????????

# ???????????

1???

???????????????????????????????????????????????????delegate????????????????????????????????????????????????????

[?????] delegate ????? ??? ??????;

public delegate void MyDel();//???????MyDel,???????void??????????  public delegate void MyDel1(string str);//???????MyDel1,???????void??????string???????  public delegate int MyDel2(int a,int b);//???????MyDel2,???????int??????int???????

2???????

?????????????????????????????????????????????????????????????????????????????????????????????

??????????

???? ????? = new ????(Target) ;

????????????????Target??????????????Target??????????()??()??????????????????
????????????????

???? ????? = Target;

??????????????Target?????C#????????????????????“????”?

MyDel2 testDel=new MyDel2(Add);  MyDel2 testDel1 = Add;

3????????

????????????????????????Invoke()??????????????????????()?????

int num = testDel(1,2);  int num1 = testDel.Invoke(1, 2);

4??????????

namespace delegateTest  {      public delegate int MyCalculator(int num1, int num2);      class Program      {          static void Main(string[] args)          {              MyCalculator myCal=new MyCalculator(Add);              int addNum= myCal(1,2);                MyCalculator myCal1 = Sub;              int subNum = myCal1.Invoke(1, 2);                Console.WriteLine("addNum:{0},subNum:{1}", addNum, subNum);                int calNum = Calculate(1, 2, Add);              Console.WriteLine("calNum:{0}", calNum);          }            static int Add(int num1, int num2)          {              Console.WriteLine("num1 + num2={0}",num1 + num2);              return num1 + num2;          }          static int Sub(int num1, int num2)          {              Console.WriteLine("num1 - num2={0}", num1 - num2);              return num1 - num2;          }          static int Calculate(int num1,int num2,MyCalculator calDel)          {              return calDel(num1,num2);          }      }  }

????????

num1 + num2=3  num1 - num2=-1  addNum:3,subNum:-1  num1 + num2=3  calNum:3

#????

???????????????????????????????????????????????????????? .NET ??????????????????????????????????????????????????????????
??????????Func???Action???Predicate???

1?Func??

Func????????????????Func??????????? Func<T1,T2, … TResult>???TResult????????????????????????T???Func????????????.NET?????16??????Funct<>???
????????????????????? void ??? void ?????????????Func????? void ?????????Action?
Func???????????????????????????

namespace delegateTest  {      class Program      {          static void Main(string[] args)          {              int calNum = Calculate(1, 2, Sub);              Console.WriteLine("calNum:{0}", calNum);// -1          }          static int Calculate(int num1, int num2, Func<int, int, int> calDel)          {              return calDel(num1,num2);          }          static int Sub(int num1, int num2)          {              Console.WriteLine("num1 - num2={0}", num1 - num2);              return num1 - num2;          }      }  }

2?Action??

Action????????? void ?????????????????16?????????Func???

namespace delegateTest  {      class Program      {          static void Main(string[] args)          {              DoSome("hello",Say);// hello          }          static void DoSome(string str,Action<string> doAction)          {              doAction(str);          }          static void Say(string str)          {              Console.WriteLine(str);          }      }  }

3?Predicate??

????????????????bool????????Func???

#????

???????????????????
???????????????????????????????????????C# 2.0?????????????????????????????? “????” ???????
???????

???? ????? = delegate (args) { ????? } ;

?????????????????????????????????????????????????????????
????????????????

MyCalculator myCal2 = delegate(int num1, int num2)  {      //?????????      Console.WriteLine(System.Reflection.MethodBase.GetCurrentMethod().Name);  // <Main>b__0      return num1 + num2;  };  int num11= myCal2(1,2);//3  

????????????????“????”??????????????????

#Lambda???

????????????????????????????????????????????????delegate???????????????C# 3.0??????Lambda????????Lambda??????????Lambda???????????????

1????Lambda

????????????????????????

MyCalculator myCal = (num1, num2) =>  num1 + num2;  int num = myCal(1, 2);// 3

??=>????Lambda?????????????????????????????????????????????????????????????????????????????
???????????Lambda?????????{}?return?????????

2???Lambda

??????????????????Lambda?

MyCalculator myCal = (int num1, int num2)=>  {      Console.WriteLine(System.Reflection.MethodBase.GetCurrentMethod().Name);      return num1 + num2;  };  int num = myCal(1, 2);// 3  

??Lambda?????{}?return???

3?Lambda?????

?????Lambda??????????????linq?????????????
????????????????????????
???????????
???

#????

???????????????????????????????????????????????????????????????????????????????????????????????????????
??????????

+=new ();

??????????????????+=????????????????????????=???????????????????????????????????????????? ?+=??????????-=????;

-=new ();

????????????????????????????????????????????????????

MyCalculator multiCal=new MyCalculator(Add);  multiCal += Sub;  int num1 = multiCal(1, 2); // -1  multiCal -= Sub;  int num2 = multiCal(1, 2); // 3

#???

https://blog.csdn.net/wnvalentin/article/details/81840339