事件与委托简介

自C# 1.0开始,界面编程时,我们就可以通过使用 += 实现与方法的关联。如我们需要点击按钮 btnClose 关闭窗体时,可以使用以下代码:

btnClose.Click += new System.EventHandler(btnClose_Click);

其中,所要调用的 btnClose_Click 方法是一个标准方法,定义如下所示。

private void btn_Click(object o, System.EventArgs j)
{Close();
}

在早期的代码中都是这么编写,后来随着 C# 3.0 的 Lambda 语法的引入,最终在VS2015开始,关联代码变得更加简洁,索性省去了事件委托,直接与方法名关联:

btnClose.Click += btnClose_Click;

事件的Lambda写法

请先看一下以下代码,这是实际项目中直接使用的一段代码。

private void InitializeDGV(DataGridViewX dgv)
{ string oldValue = null;dgv.CellBeginEdit += (sender, e) => oldValue = (sender as DataGridView).Value.ToString();dgv.CellEndEdit += (sender, e) =>{DataGridViewCell editCell = dgv.Rows[dgv.CurrentCell.RowIndex].Cells[1]; if(editCell.Value.ToString() != oldValue)doSomething();};
}

可以看到,我们直接将事件与对应的事件方法使用 Lambda 表达式关联。比如,可以直接使用 => 进行关联,如 dgv.CellBeginEdit += (sender, e) => oldValue = (sender as DataGridView).Value.ToString(); 语法非常简洁。如果有多条语句,则使用大括号括起来即可。

作用域

在这个函数中,我们定义了 CellBeginEdit 和 CellEndEdit 两个事件的处理函数。在这两个函数中,我们可以发现,定义了一个变量 oldValue 用于记录原值,然后当值在编辑后如果发生变化,则做相应的处理。这里我们可以发现,虽然 oldValue 一个函数级变量,但是它的作用域实际上是对象级的。因为在实际的应用中,开始编辑和结束编辑这两个事件发生后,都会对其进行调用,且调用的结果都会有变化。换言之,如果仅是函数内级变量,应该其只能是第一次赋值时的值,以后不会再发生变化。所以这点要特别注意。

C# 事件中委托方法的Lambda简洁写法用及作用域相关推荐

  1. form表单的onsubmit事件中调用方法时为什么前面加return

    表单(from)编写onsubmit()脚本的时候,经常需要验证表单中数据的合法性,所以常会写道:<form action="/admin/addUser.do" metho ...

  2. vue 点击事件传递多个参数_Vue子组件监听事件中传递参数的方法

    在子组件中,我们可以通过以下方式监听事件: v-on:click="$emit('funcName',a)" 如果需要传多个参数,可以通过以下方式: v-on:click=&quo ...

  3. Cognex.VisionPro.QuickBuild命名空间下的一些委托方法

    C#的核心是事件与委托,在学习visionpro时,应该贯彻这个思想,康耐视官方在visionpro中也提供了十分丰富的事件与委托方法供大家二次开发.下面是Cognex.VisionPro.Quick ...

  4. 在.NET2.0中如何更简单的使用委托将方法加载到事件中去

    我们知道在System命名空间中,.NET为我们提供了EventHandler的委托,它的原型是delegate void EventHandler(object sender,EventArgs e ...

  5. XLua Lua访问C#中的方法(四)访问委托、事件

    委托 在使用Lua代码访问C#委托时需要注意,访问委托类型的方式与访问静态变量的方式相同, 访问(静态/非静态)委托的变量的方式与访问(静态/非静态)成员变量的方式相同 由于在Lua中没有" ...

  6. JS事件冒泡机制以及委托方法,以及vue中的stop

    要理解事件冒泡机制,就得先了解事件. 浏览器是事件驱动型的,根据用户的行为触发不同的事件,根据事件执行相应的操作.我们较为熟悉的事件有三大类型:鼠标键盘事件.页面事件.表单相关事件. 鼠标键盘事件:o ...

  7. C# 从CIL代码了解委托,匿名方法,Lambda 表达式和闭包本质

    前言 C# 3.0 引入了 Lambda 表达式,程序员们很快就开始习惯并爱上这种简洁并极具表达力的函数式编程特性. 本着知其然,还要知其所以然的学习态度,笔者不禁想到了几个问题. (1)匿名函数(匿 ...

  8. Observer设计模式中-委托事件-应用在消息在窗体上显示

    Observer设计模式:监视者模式.在类中的方法中处理的结果或者消息通过事件委托 的方式发送给主窗体. 因为在其它类中直接访问主窗体类,显示内容是不能直接调用控件赋值的,当然也有别的类似查阅控件名, ...

  9. C#中的委托和事件 (4)---事件和委托的编译代码

    事件和委托的编译代码 这时候,我们不得不注释掉编译错误的行,然后重新进行编译,再借助Reflactor来对 event的声明语句做一探究,看看为什么会发生这样的错误: public event Gre ...

最新文章

  1. 机器学习算法加强——回归
  2. delphi ui编辑工具源码_一种无侵入比swagger-ui兼容性更好更简单的API文档生成方案
  3. 函数的命名空间以及作用域
  4. 企业级实战03_真实项目实战SpringMVC整合ActiveMQ
  5. python中的装饰器
  6. LwIP之ARP协议
  7. 高效数据序列化的工具 FlatBuffers 的初体验
  8. 语义分割之原图与mask的可视化
  9. android des ecb加密_Android逆向 | 基础知识篇 01
  10. kakfa从入门到放弃(四): 分区和副本机制、高级与低级API、 kafka-eagle、原理、数据清理、限速
  11. 实验五:大数据可视化工具-NodeXL
  12. DSP中EALLOW,EDIS,EINT,DINT,ERTM,DRTM的作用
  13. 力扣438题找到字符串中所有字母异位词
  14. 列表,元组,字典,集合类型变量相关内置函数详解
  15. 概率论知识回顾(二):古典概型,几何概型
  16. 遍历读取文件夹下的所有文件
  17. Unity3D RPG角色扮演游戏源码(上下)-----源代码分析----01-----主角人物动画
  18. FNDLOAD命令整合
  19. 关于亚马逊开店需要做哪些准备
  20. python 无脸男

热门文章

  1. Chapter 6 (Orthogonality and Least Squares): Applications to linear models
  2. 数学建模笔记-熵权法确定评价类问题指标的权重 清风课程笔记整理
  3. Distilling Object Detectors with Fine-grained Feature Imitation
  4. 今年淘宝双11,好尴尬
  5. 浅析PAC,修改PAC文件及user-rule文件实现自动代理
  6. vue普通字符串拼接html,vue中如何拼接字符串
  7. 5分钟快速安装蓝天采集器
  8. WPF文字阴影 文字描边
  9. 通过移动执法办案系统推进城市管理“网上办案”
  10. Java实现登录功能(含修改密码 退出登录等)