zoukankan      html  css  js  c++  java
  • 委托、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         }
    View Code

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

     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         }
    View Code

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

  • 相关阅读:
    8、【C++基础】内存管理
    7、【C++基础】内联函数、友元函数
    5、【C++基础】强制类型转换
    4、【C++基础】引用和指针
    3、【C++基础】基本的输入输出
    2、【C++基础】命名空间
    1、【C++基础】bool数据类型
    13、【C语言基础】预处理器、头文件
    6、git常用命令总结
    5、git标签管理
  • 原文地址:https://www.cnblogs.com/liehuochongsheng/p/4055009.html
Copyright © 2011-2022 走看看