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
1?Func??
Func
????????????????????? void ??? void ?????????????Func
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
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