每天进步一点--c#基础巩固,事件、委托
要想技术有所提高,就是把有些问题真正的弄懂弄明白,我从事C#开发两年了,一直对事件委托等概念一知半解,有时候博客园上看看别的大牛的文章,看看懂了就过去了,时间长了又忘了,真正理解还是要自己动手弄些例子,搞懂这些概念,我写文章也是出于这个目的,希望和大家一块学习进步。
我还是拿经典的例子来说明:猫叫,老鼠跑,主人吵醒了。
我们用事件的方法来实现,把猫叫作为触发事件的方法,绑定在这个事件上的方法都会被触发。
先用网上大家的例子:
public class Cat
{
/// <summary>
/// 猫叫方法
/// </summary>
public void Miao()
{
Console.WriteLine("喵喵喵喵喵喵");
if (OnMiao != null)
OnMiao(this,EventArgs.Empty);
}
/// <summary>
/// 猫叫事件
/// </summary>
public event EventHandler OnMiao;
}
public class Master
{
public Master()
{
}
/// <summary>
/// 主人被叫醒了
/// </summary>
public void Wake()
{
Console.WriteLine("死猫叫啥叫,吵我睡觉!!!");
}
}
public class Mouse
{
public Mouse()
{
}
/// <summary>
/// 老鼠跑
/// </summary>
public void Run()
{
Console.WriteLine("猫来了,快跑!!!!");
}
}
客户端代码
class Program
{
static void Main(string[] args)
{
Cat cat = new Cat();
Mouse mouse = new Mouse();
Master master = new Master(); cat.OnMiao += delegate { mouse.Run(); };
cat.OnMiao += delegate { master.Wake(); }; cat.Miao();
} }
这个办法可以实现,猫叫,老鼠跑,主人醒。但如果我想拓展下呢,主人叫有好几只猫,每只猫叫的声音都不一样,主人吵醒后要知道哪只猫把他吵醒了。
现在我们改写Cat类
/// <summary>
/// 我们自定义事件数据
/// </summary>
public class CatEventArgs : EventArgs
{
public string CatName { get; set; }
}
public class Cat
{
/// <summary>
/// 定义事件委托
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
public delegate void CatEventHandler(object sender, CatEventArgs e);
public Cat()
{
}
/// <summary>
/// 猫叫
/// </summary>
public void Miao()
{
Console.WriteLine("喵喵喵喵喵喵");
if (OnMiao != null)
{
CatEventArgs catEventArgs = new CatEventArgs();
catEventArgs.CatName = "Tom";
OnMiao(this, catEventArgs);
}
}
/// <summary>
/// 猫叫完成事件
/// </summary>
public event CatEventHandler OnMiao;
}
客户端代码
class Program
{
static void Main(string[] args)
{
Cat cat = new Cat();
Mouse mouse = new Mouse();
Master master = new Master(); cat.OnMiao += cat_OnMiao;
cat.OnMiao += delegate { master.Wake(); }; cat.Miao();
} static void cat_OnMiao(object sender, CatEventArgs e)
{
Console.WriteLine(string.Format("{0}猫在叫",e.CatName));
}
}
这样就知道哪只猫叫了,关键是我们自定义了CatEventArgs,这个类继承了EventArgs,可以传递事件信息,自定义信息,并且自定义事件委托public delegate void CatEventHandler(object sender, CatEventArgs e);
自己的小例子,大牛勿笑;新的一年祝大家心想事成,更上一层楼
--每天有点进步
每天进步一点--c#基础巩固,事件、委托的更多相关文章
- C#基础加强篇—委托、Lambda表达式和事件(下)
3.事件 事件作为C#中的一种类型,为类和类的实例定义发出通知的能力,从而将事件和可执行代码捆绑在了一起.事件是对象发送的消息,以发信号通知操作的发生.操作可能是由用户交互引起的,也可能是由某些其他的 ...
- C#基础篇 - 理解委托和事件
1.委托 委托类似于C++中的函数指针(一个指向内存位置的指针).委托是C#中类型安全的,可以订阅一个或多个具有相同签名方法的函数指针.简单理解,委托是一种可以把函数当做参数传递的类型.很多情况下,某 ...
- C#-WebForm-WebForm开发基础、如何给控件注册事件?——事件委托写法、http无状态性、三层结构
(小知识 - xml:可扩展的标记语言 html:超文本标记语言) 一.创建WebForm:新建→网站 此时文件夹中只有一个 config 文件,打开后 二.在项目下右键添加新项 在设计页面中打开 从 ...
- C# 篇基础知识5——委托和事件
事件处理程序是基于“委托”机制运行的. 1.委托 (1)委托的定义和使用 有时需要将一个函数作为另一个函数的参数,这时就要用到委托(Delegate)机制.例如设计一个马戏表演函数: //定义委托 d ...
- Dom基础(三):事件冒泡,事件委托(事件代理)和事件捕获
javascript中的addEventListener(事件名,回调,布尔) 其中第三个参数默认为false-事件冒泡,true为事件捕获 二者区别: 事件冒泡:目标元素事件先触发,然后父元素事件触 ...
- 怎么理解js中的事件委托
怎么理解js中的事件委托 时间 2015-01-15 00:59:59 SegmentFault 原文 http://segmentfault.com/blog/sunchengli/119000 ...
- jquery 事件委托
什么事件委托? DOM在为页面中的每个元素分派事件时,相应的元素一般都在事件冒泡阶段处理事件.在类似 body > div > a 这样的结构中,如果单击a元素,click事件会从a一直冒 ...
- jQuery代码优化:事件委托篇
推荐阅读原文:http://www.ituring.com.cn/article/467# 推荐11收藏 随着DOM结构的复杂化和Ajax等动态脚本技术的运用,事件委托自然浮出了水面.jQuery为绑 ...
- 整理了一些jQuery关于事件冒泡和事件委托的技巧
首先,大家都知道,jQuery事件触发时有2种机制,一种是事件委托,另一种是事件冒泡(IE情况暂时不考虑).拿click事件做例子,先附上一段代码: html: <body> <di ...
随机推荐
- 使用 Razor 生成 HTML5 中的 data- 属性
在 HTML5 中, 可以使用 data- 属性来表示用户数据,这些数据甚至可以是 JSON 格式的数据,对 Web 前端开发带来很大的方便. 在 MVC 的 Razor 中,可以使用匿名对象来生成定 ...
- 视差贴图(Parallax Mapping)
使用顶点光照的模型,当模型的面数很少的时候,光照效果会显得很奇怪,因为只有顶点上的光照是正确计算出来的,三角面上的光照都是通过硬件插值得到,所以难免会出现问题.基于像素的光照可以很好的改善这个问题.如 ...
- Start:at cnblogs firstDay
C#旨在设计成为一种"简单.现代.通用",以及面向对象的程序设计语言,此种语言的实现,应提供对于以下软件工程要素的支持:强类型检查.数组维度检查.未初始化的变量引用检测.自动垃圾收 ...
- MySQL数据库获取多个汉字拼音的首字母函数
需求简介:最近的一个项目,想实现如下图所示的显示效果.很明显,如果能够获取对应的汉字词组中每个汉字的拼音首字母就可以实现了,如果是固定的几组汉字,人为的拼一下就可以 了,不过项目中有多处功能需要这个效 ...
- Activity的task相关 详解
task是一个具有栈结构的容器,可以放置多个Activity实例.启动一个应用,系统就会为之创建一个task,来放置根Activity:默认情况下,一个Activity启动另一个Activity时,两 ...
- PL/SQL 导入excel表格到oracle数据表
通过使用PL/SQL 批量查询取数时,将excel中的每一列数据复制黏贴进新建的中间表,黏贴时会有贴歪的情况,也就是某些列会从第二第三行开始插入整列,导致数据乱掉,然后好像又不支持批量删除整列数据,所 ...
- Duilib学习笔记《03》— 控件使用
在前面已经对duilib有个一个基本的了解,并且创建了简单的空白窗体.这仅仅只是一个开始,如何去创建一个绚丽多彩的界面呢?这就需要一些控件元素(按钮.文本框.列表框等等)来完善. 一. Duilib控 ...
- CLRS:master theory in complexity of algorithm
T(n)=aT(n/b)+f(n); where we can interpret n/b to mean either floor(b/n) or ceil(b/n), Then T (n) has ...
- C# (GDI+相关) 图像处理(各种旋转、改变大小、柔化、锐化、雾化、底片、浮雕、黑白、滤镜效果) (转)
C#图像处理 (各种旋转.改变大小.柔化.锐化.雾化.底片.浮雕.黑白.滤镜效果) 一.各种旋转.改变大小 注意:先要添加画图相关的using引用. //向右旋转图像90°代码如下 ...
- (笔记)angular 包含关系的controller参数传递