本章是委托、事件的进阶。
delegate关键字
Delegate至少0个参数,至多32个参数,可以无返回值,也可以指定返回值类型。
01、声明委托。
02、委托的实例化。
03、委托实例的调用。
.net core中 委托依然使用的很多。
无参数无返回值的委托的应用案例:
.net 1.0的使用方式:
1 | public delegate void NoReturnNoPara(); |
1 | NoReturnNoPara method = new NoReturnNoPara(this.DoNothing); |
1 | private void DoNothing() |
.net 2.0的使用方式:
1 | NoReturnNoPara method = new NoReturnNoPara( |
.net 3.0以上的使用方式:
1 | NoReturnNoPara method = new NoReturnNoPara( |
1 | NoReturnNoPara method = new NoReturnNoPara( |
1 | NoReturnNoPara method = new NoReturnNoPara( |
1 | NoReturnNoPara method = (id,name) => Console.WriteLine($"这里是DoNothing!{id}{name}") //new NoReturnNoPara也可以去掉! 委托实例化,将Lambda表达式来给! |
以上是Lambda表达式的由来!
深入阶段:
委托不用被定义,用框架提供的两个委托** Action、Func外加Lambda表达式**来实现。
心得体会:
01、传入的方法必须根委托约束的一致。
02、委托更多的是一种面向抽象的思维方式。
** Action和Func:**
** 框架提供饿两个泛型委托,不用自己声明了。Action无返回值,Func有返回值。**
Action是无返回值的泛型委托。
1 | Action 表示无参,无返回值的委托。 本质: public delegate void Action<in T>(T obj); //in与out的使用! |
1 | public void Test<T>(Action<T> action,T p) |
1 | private void DoAction(Action action) // 声明一个方法,传入参数类型为action委托的。 |
1 | this.DoAction(action01/02/03); // 调用的普通方法,只不过传入参数为action委托 |
Action+Lambda表达式
1 | Action act01=new Action()=>Console.WriteLine("这里是DoNothing"); |
1 | Action act01=()=>Console.WriteLine("这里是DoNothing"); // 不带参数的Action |
1 | Action<string> action02=(s)=>Console.WriteLine($"传入的参数是{s}"); // 带参数的Action |
1 | Action<string> action02 = s =>{}; // 如果只有一个参数可以去掉小括号! |
1 | Action<string,int>action03=(s,2)=>Console.WriteLine($"传入的参数是{string}{int}"); // 带有两个参数的,无返回值的Action。 |
Func是带有返回值的泛型委托。
1 | Func<int> 表示无参,返回值为int的委托 本质是:public delegate TResult Func<out TResult>(); |
1 | public int Test<T1,T2>(Func<T1,T2,int>func,T1 a,T2 b) |
Func+Lambda表达式
1 | Func<int> func=new Func<int>( // 无参数,返回值为int的委托 |
1 | Func<int> func02 = new Func<int>( |
1 | Func<int> func02 = () => DateTime.Now.Year; // 无参数,返回值为int的Func委托的最终写法 (如果方法只有一行的情况下,return也可以去掉) |
1 | Func<int> func02 = () =>{ |
1 | Func<int, string> func03 = new Func<int, string>(t => t.ToString()); // 参数为int,返回值为string的Func委托。 |
1 | Func<int, string> func04 = (t => t.ToString()); // 参数为int,返回值为string的Func委托的最终写法。 |
** Predicate 是返回bool型的泛型委托。**
1 | predicate<int> 表示传入参数为int 返回bool的委托 |
1 | public delegate bool Predicate<T> (T obj) |
1 | static void Main(string[] args) |
Lambda表达式的本质是?哪些地方使用?
Lambda表达式的本质是匿名方法,也就是个一个方法。
委托中使用!
表达式目录树中经常使用!,表达式目录树是一个数据结构。
Linq中经常使用!
- 本文作者: 梁俊可
- 本文链接: http://ljk3d.com/2021/10/19/cSharpNote/CSharp高级进阶教程_05_委托的Action、Func与(匿名方法)、Lambda表达式的应用/
- 版权声明: 梁俊可工作室