c#基础知识---委托,匿名函数,lambda
前言:
C#中的委托(Delegate)类似于C或C++中函数的指针。委托是存有对某个方法的引用的一种引用类型变量。引用可在运行时被改变。委托(Delegate)特别用于实现事件和回调方法。所有的委托都派生自System.Delegate类。把一个方法当作参数传递,让其它方法进行调用执行。
1.委托的声明
委托声明决定了可由该委托引用的方法。委托可指向一个与其具有相同标签的方法。
1.1.delegate
1.1.1.0-23个参数,可以有返回值也可以没有返回值
publicdelegateintMyDelegateEventHandler(stringparm);
注:(1).此委托指向的方法必须是参数为string类型,返回类型为int类型的。其他声明类比所得。
(2).EventHandler是c#命名规范,当然我理解规范就是可以随意啦。
(3).委托调用时必须判断是否为null不然会报异常
(4).事件也是一种委托
1.1.2.委托的调用
MyDelegateEventHandlerfun=newMyDelegateEventHandler(method); or MyDelegateEventHandlerfun=method; //fun不为空,则调用回调方法 if(fun!=null) { fun(val); } //fun?.Invoke(val);简化版本调用
1.1.3.委托的多播
每个委托都只包含一个方法调用,如果调用多个方法,就需要多次显示调用这个委托。如果同一个委托调用多个方法,我们就可以用多播委托
publicdelegatevoidMyDelegate(); publicvoidMyMethod() { //# } publicvoidMyMethod1() { //# } publicvoidMyMethod2() { //# } MyDelegateEnventHandermyDelegate; myDelegate=newMyDelegateEventHander(MyMethod); myDelegate+=newMyDelegateEventHander(MyMethod1); ........... //调用 myDelegate();
注:
1.委托对象可使用"+"运算符进行合并;
2."-"运算符可用于从合并的委托中移除组件委托;
3.委托指定方法类型必须一致;
4.返回类型一般为void,但非必须;
5.GetInvocationList获取委托索引
if(MyDelegate!=null) System.Delegate[]dels=MyDelegate.GetInvocationList(); for(inti=0;i以上是利用GetInvocationList获取委托索引的一个简单应用。
1.2.Action
Action至少0个参数,至多16个参数,无返回值。
Action表示无参,无返回值的委托 Action表示有传入参数int,string无返回值的委托 Action 表示有传入参数int,string,bool无返回值的委托 Action 表示有传入4个int型参数,无返回值的委托 publicvoidTest(Action action,Tp) { action(p); } 1.3.Func
Func至少0个参数,至多16个参数,根据返回值泛型返回。必须有返回值,不可void
Func是无返回值的泛型委托 Func表示无参,返回值为int的委托 Func 1.4.predicate
1.predicate是返回bool型的泛型委托;
2.predicate
表示传入参数为int返回bool的委托; 3.Predicate有且只有一个参数,返回值固定为bool;
publicdelegateboolPredicate(Tobj) 2.委托的实例化
2.1.delegate
publicdelegateintMyDelegateEventHandler(stringparm) publicintMyMethod(stringparm) { //# } MyDelegateEventHandlerMyDelegate=newMyDelegateEventHandler(MyMethod)注:委托实例化的时候,委托对象必须使用new关键字来创建,且与一个特定的方法有关。委托参数中的方法不含参数。
2.2.Action的使用
publicvoidTest(Action action,Tp) { action(p); } privatevoidAction(strings) { # } //调用 Test (Action,"wyl"); 2.3.Func的使用
publicintTest(Func func,T1a,T2b) { returnfunc(a,b); } privateintFun(inta,intb) { # } //调用 Test (Fun,100,200) 2.4委托实现冒泡排序
//定义对象 classStudent { publicstringName{get;privateset;} publicdecimalScores{get;privateset;} publicStudent(stringname,decimalscores) { this.Name=name;this.Scores=scores; } publicoverridestringToString() { returnstring.Format("{0},{1:C}",Name,Scores); } publicstaticboolCompareScores(Studente1,Studente2) { returne1.Scores(IList sortArray,Func comparison) { boolswapped=true; do { swapped=false; for(inti=0;i 3.匿名函数与lambda
3.1什么是匿名函数
匿名函数是一个“内联”语句或表达式,可在需要委托类型的任何地方使用。
可以使用匿名函数来初始化命名委托(无需取名字的委托),或传递命名委托(而不是命名委托类型,传递一个方法块,而不是委托类型)[callback的方式]作为方法参数。
MyDelegatefunDelegate=delegate(strings){Console.WriteLine(s);}; funDelegate("thisisanonymousdelegate");3.2.lambda
lambda表达式实际上是一个匿名函数。编译器在看到lambda之后会在类中自动定义一个新的私有方法。lambda必须匹配委托!其中lambda是从c#3.0后引用的
lambda的语法:
参数=>方法体。
=>左边是要传入的参数,本例中是传入一个Int类型的变量,=>右边是具体的代码。
//如果不传递参数: ()=>Console.WriteLine("HelloWorld!") //传递一个参数: (intn)=>Console.WriteLine(n.ToString()) //或者去掉()和int编译器会自己推断类型: n=>Console.WriteLine(n.ToString()) //传递多个参数: (intn,intm)=>Console.WriteLine(n+m) //或者编译器自己推断类型: (n,m)=>Console.WriteLine(m+n)4.综上:
1.委托类似于C++函数指针。
2.委托允许将方法作为参数进行传递。
3.委托可用于定义回调方法。
4.委托可以链接在一起;多播。
5.方法不必与委托签名完全匹配。
以上就是c#基础知识---委托,匿名函数,lambda的详细内容,更多关于c#委托,匿名函数,lambda的资料请关注毛票票其它相关文章!