委托、lambda表达式、回调

今天接手wpf版的交通管理项目,由于前人一走,剩下一堆半成熟的代码交由我负责,随之我就开始了痛苦的阅读代码的过程。

前人是一个从事了5年的高手,写的代码很高深,各种委托、事件、lambda、回调到处都是,向我这种只懂简单的委托和事件的小白,读起来可想多痛苦。最痛苦的是,很少甚至没有注释,我顿时无语了。工作还得做,毕竟还得混下去,我就慢慢看他写的代码。今天看他的某个代码中的某个方法,具体如下。

下面的这个方法是执行查询的某个方法

 1 /// <summary>
 2         /// 执行查询
 3         /// </summary>
 4         /// <param name="startTime"></param>
 5         /// <param name="endTime"></param>
 6         /// <param name="listGateChannel"></param>
 7         /// <param name="condition"></param>
 8         /// <param name="page"></param>
 9         /// <param name="pageSize"></param>
10         private void QueryFromServer(DateTime startTime, DateTime endTime, List<RmpGateChannel> listGateChannel, string condition, int page, int pageSize)
11         {
12             m_rmpServiceHelper.GetVehicleAccess(startTime, endTime, listGateChannel, condition, pageSize, (lstVehicle) =>
13             {
14                 if (lstVehicle == null || lstVehicle.Count == 0)
15                 {
16                     MessageHelper.Show("未查询到相关记录", MessageType.Ok, 1);
17                     return;
18                 }
19                 _listVehicle.Clear();
20                 foreach (VehicleInfoDisplay item in lstVehicle)
21                 {
22                     _listVehicle.Add(item);
23                     _allDataItems.Add(item);
24                     dataPager.IsShowMoreButton = true;
25                 }
26                 dataPager.TotalCount = _allDataItems.Count;
27             });
28
29         }

这个方法是上面最后一个参数(也是匿名方法里的某个方法)

 1 /// <summary>
 2         /// 获取第一页通行记录
 3         /// </summary>
 4         /// <param name="startTime"></param>
 5         /// <param name="endTime"></param>
 6         /// <param name="lstChannel"></param>
 7         /// <param name="condition"></param>
 8         /// <param name="callBack"></param>
 9         public void GetVehicleAccess(DateTime startTime, DateTime endTime, List<RmpGateChannel> lstChannel, string condition, int pageSize, Action<List<VehicleInfoDisplay>> callBack)
10         {
11             CommunicationHelper.Instance.SendMessage((client) =>
12             {
13                 string[] arrTypes = new string[lstChannel.Count];
14                 int?[] arrIds = new int?[lstChannel.Count];
15                 for (int i = 0; i < arrTypes.Length; i++)
16                 {
17                     arrTypes[i] = "HostChannel";
18                 }
19                 for (int i = 0; i < lstChannel.Count; i++)
20                 {
21                     arrIds[i] = lstChannel[i].InternalObjectId;
22                 }
23                 m_pageInfo = client.PagePlusVehicleAccessInfoLogEx2(startTime, endTime, arrTypes, arrIds, condition, "", 1, pageSize);
24                 List<vehicleAccessInfoLogEx3> tempList = new List<vehicleAccessInfoLogEx3>();
25                 if (m_pageInfo.recordTotalNum > 0 && m_pageInfo.vehicleAccessInfo.Length > 0)
26                 {
27                     tempList.AddRange(m_pageInfo.vehicleAccessInfo.OrderBy(o => o.accessTime));
28                 }
29                 List<VehicleInfoDisplay> displayList = new List<VehicleInfoDisplay>();
30                 foreach (vehicleAccessInfoLogEx1 obj in tempList)
31                 {
32                     VehicleInfoDisplay display = VehicleAccessInfoToDisplay.GetVehicleInfo(obj);
33                     displayList.Add(display);
34                 }
35                 if (callBack != null)
36                 {
37                     DispatcherHelper.RunSync(new Action(() =>
38                     {
39                         callBack(displayList);
40                     }), null);
41                 }
42             });
43
44         }

看完之后是不是有点头大。经过各种查资料和分析,发现第一个方法的最后一个参数是个lambda表达式,也就是个匿名方法。方法作为参数传递,我们首先就想到是委托,然后在这匿名方法里面执行了一些操作,这个时候发现,这个还是个回调。为什么这么说呢,因为我们没有传值给这个匿名方法啊,但是我们确实用了这个值参啊。又根据回调的定义,顿时明了,被调函数传递一个方法给主调函数,主调函数传值给被调,再执行被调函数。

时间: 2025-01-02 12:56:40

委托、lambda表达式、回调的相关文章

个人总结:匿名委托+内置委托+Lambda表达式

匿名委托+内置委托+Lambda表达式 概要 在实际开发中,项目开发框架不同,用到的技术是不一样的,这里总结一下用Linq开发,ORM之EF开发会大量使用的Lambda表达式; 正文 之前提过.Net有一套扩展在IEumberable<T>泛型接口的扩展方法,本文是从这个基础继续总结; 1.void Action<in T>: 先拿一个ForEach()来讲: public void ForEach(Action<T> action); 这个Action<T>

委托 lambda表达式浅显理解

方法不能跟变量一样当参数传递,怎么办,C#定义了委托,就可以把方法当变量一样传递了,为了简单,匿名方法传递,省得再声明方法了:再简单,lambda表达式传递,比匿名方法更直观. public delegate int delegateArithmetic(int a, int b); //委托作为参数,方法传递给委托 public int result(int x,int y,delegateArithmetic delAri) { return delAri(x, y); } public i

C# 委托,Lambda表达式,事件

本文章参考sikiC#高级篇,转载请注明出处. 什么是委托 如果我们要把方法当做参数来传递的话,就要用到委托.简单来说委托是一个类型,这个类型可以赋值一个方法的引用. 声明委托与使用 声明委托有四种方式.一种是原生的,另外三种是C#为了方便给我们封装好的. 四种声明方式分别为delegate, Action, Func, 在C#中使用一个类分为两个阶段,首先定义这个类,告诉编译器这个类由什么字段和方法组成,然后使用这个类实例化对象.在我们使用委托的时候,也需要经过这两个阶段,首先定义委托,告诉编

Lambda表达式演变

Lambda表达式是一种匿名函数. 演变步骤: 一般的方法委托 => 匿名函数委托 => Lambda表达式 Lambda表达式其实并不陌生,他的前生就是匿名函数,所以要谈Lambda表达式,就不得不谈匿名函数,要谈匿名函数,那又要不得不谈委托. 委托非常好理解,类似于C++里面的函数指针(指向了一个方法),并且委托约束了待指向方法的签名(由返回类型和参数组成). 首先,定义一个委托如 : delegate int ProcessInt(int i); 定义了委托可以像变量一样传递方法.如:

委托、匿名函数、Lambda表达式和事件的学习

委托: 还记得C++里的函数指针么?大家可以点击这里查看一下以前的笔记.C#的委托和C++中的函数指针效果一致. 当我们需要将函数作为对象进行传递和使用时就需要用到委托. 下面我们看一个例子: 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace Test 8 { 9 cl

委托与Lambda表达式

// 声明一个委托 // 委托就是一个类型 // Add: 委托类型的变量 // 类型: double(int, int) // 是一个方法类型,返回值类型是double,参数类型是(int, int) delegate double Add(int a, int b); class Program { public static void Main(string[] args) { // 将Add类型的变量a指向Plus方法 Add a = new Add(Plus); // 现在 a 就是

委托,匿名函数和lambda表达式

很早之前就接触到了委托,但是一直对他用的不是太多,主要是本人是菜鸟,能写的比较高级的代码确实不多,但是最近在看MSDN微软的类库的时候,发现了微软的类库好多都用到了委托,于是决定好好的研究研究,加深一下自己对他的印象,顺便把自己的感悟和想法写出来,以便自己能有更深的理解,由于本人水平有限,也欢迎大家多多探讨,有问题大家一起解决一起进步. MSDN上面对委托的定义是:delegate 是表示对具有特定参数列表和返回类型的方法的引用的类型.在我看来委托的特性主要在: 1.把一个方法当做一个参数传递给

04.C#委托、Lambda表达式

1.委托 (1)委托的本质 委托实际上就是指向函数的指针.在C#中委托是一种类型,定义一个委托就是定义一个新的类,它与类的地位是一样的,所以可以定义类的地方都可以定义委托! 实际上,使用delegate关键字定义的委托继承了System.MulticastDelegate类,而System.MulticastDelegate类又继承了System.Delegate. Delegate:表示委托,委托是一种数据结构,它引用静态方法或引用类实例及该类的实例方法. MulticastDelegate:

lambda表达式与委托与线程初步谈论-基于刘铁锰视频观后操作

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;//线程 using System.Threading;//引用线程方法 namespace ConsoleApplication2 { class Program { static void Main(string[] args) { //委托详解 //Func返回带