c#委托与事件2
首先是一个关机器的一般方法:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace DelegateDemo
{
class Program
{
static void Main(string[] args)
{
FoldingMachine folder = new FoldingMachine();
WeldingMachine welder = new WeldingMachine();
PaintingMachine painter = new PaintingMachine(); Controller controller = new Controller();
controller.Folder = folder;
controller.Welder = welder;
controller.Painter = painter;
controller.ShutDown();
Console.ReadKey();
}
}
}
Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace DelegateDemo
{
class Controller
{
private FoldingMachine folder;
private WeldingMachine welder;
private PaintingMachine painter;
public void ShutDown()
{
folder.FinishFolding();
welder.FinishWelding();
painter.PaintOff();
}
public FoldingMachine Folder
{
set { this.folder = value; }
} public WeldingMachine Welder
{
set { this.welder = value; }
} public PaintingMachine Painter
{
set { this.painter = value; }
} }
}
Controller.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace DelegateDemo
{
class FoldingMachine
{
public void StopFolding(int ShutDownTime)
{
Console.WriteLine("stop FoldingMachine");
} public void FinishFolding()
{
StopFolding();
}
}
}
FoldingMachine.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace DelegateDemo
{
class PaintingMachine
{
public void PaintOff()
{
Console.WriteLine("stop PaintingMachine");
}
}
}
PaintingMachine.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace DelegateDemo
{
class WeldingMachine
{
public void FinishWelding()
{
Console.WriteLine("stop WeldingMachine.");
}
}
}
WeldingMachine.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace DelegateDemo
{
class Program
{
static void Main(string[] args)
{
FoldingMachine folder = new FoldingMachine();
WeldingMachine welder = new WeldingMachine();
PaintingMachine painter = new PaintingMachine(); Controller controller = new Controller();
controller.Folder = folder;
controller.Welder = welder;
controller.Painter = painter;
controller.ShutDown();
controller.StopManchinery();
Console.ReadKey();
}
}
}
Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace DelegateDemo
{
class Controller
{
private FoldingMachine folder;
private WeldingMachine welder;
private PaintingMachine painter;
public delegate void stopManchineryDelegate();
stopManchineryDelegate stopManchinery; public Controller() { //
}
public stopManchineryDelegate StopManchinery
{
get { return stopManchinery; }
set { stopManchinery += value; }
}
public void SetStopManchinery()
{
//stopManchinery = new stopManchineryDelegate(folder.StopFolding);
stopManchinery += folder.StopFolding;
stopManchinery += welder.FinishWelding;
stopManchinery += painter.PaintOff; }
public void ShutDown()
{
//folder.FinishFolding();
//welder.FinishWelding();
//painter.PaintOff();
SetStopManchinery();
}
public FoldingMachine Folder
{
set { this.folder = value; }
} public WeldingMachine Welder
{
set { this.welder = value; }
} public PaintingMachine Painter
{
set { this.painter = value; }
} }
}
Controller.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace DelegateDemo
{
class FoldingMachine
{
public void StopFolding()
{
Console.WriteLine("stop FoldingMachine");
} public void FinishFolding()
{
StopFolding();
}
}
}
FoldingMachine
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace DelegateDemo
{
class PaintingMachine
{
public void PaintOff()
{
Console.WriteLine("stop PaintingMachine");
}
}
}
PaintingMachine
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace DelegateDemo
{
class WeldingMachine
{
public void FinishWelding()
{
Console.WriteLine("stop WeldingMachine.");
}
}
}
WeldingMachine.cs
注意委托(其实就是指针,指向函数的指针,也就是函数指针)的参数要与所指向的函数的参数相同,体现到代码中就是FoldingMachine.cs中的修改。另外一个类中的字段即使是public也不能在另一个类中直接使用,所以代码中使用了方法(controller.StopManchinery();)来使用另一个类中的委托。
lamada表达式:
事件:
事件的调用只能在定义事件的类的内部调用,无论是用public还是private修饰事件。委托违反了封装的原则,事件封装委托,保证了封装。
参考:http://blog.csdn.net/jamestaosh/article/details/4372172
要创建一个事件驱动的程序需要下面的步骤:
1. 声明关于事件的委托;
2. 声明事件;
3. 编写触发事件的函数;
4. 创建事件处理程序;
5. 注册事件处理程序;
6. 在适当的条件下触发事件。
现在我们来编写一个自定义事件的程序。主人养了一条忠实的看门狗,晚上主人睡觉的时候,狗负责看守房子。一旦有小偷进来,狗就发出一个Alarm事件,主人接到Alarm事件后就会采取相应的行动。假设小偷于2009年元旦午夜时分到达。
//事件发送者
class Dog
{
//1.声明关于事件的委托;
public delegate void AlarmEventHandler(object sender, EventArgs e); //2.声明事件;
public event AlarmEventHandler Alarm; //3.编写引发事件的函数;
public void OnAlarm()
{
if (this.Alarm != null)
{
Console.WriteLine("/n狗报警: 有小偷进来了,汪汪~~~~~~~");
this.Alarm(this, new EventArgs()); //发出警报
}
}
} //事件接收者
class Host
{
//4.编写事件处理程序
void HostHandleAlarm(object sender, EventArgs e)
{
Console.WriteLine("主 人: 抓住了小偷!");
} //5.注册事件处理程序
public Host(Dog dog)
{
dog.Alarm += new Dog.AlarmEventHandler(HostHandleAlarm);
}
} //6.现在来触发事件
class Program
{
static void Main(string[] args)
{
Dog dog = new Dog();
Host host = new Host(dog); //当前时间,从2008年12月31日23:59:50开始计时
DateTime now = new DateTime(2008, 12, 31, 23, 59, 50);
DateTime midnight = new DateTime(2009, 1, 1, 0, 0, 0); //等待午夜的到来
Console.WriteLine("时间一秒一秒地流逝... ");
while (now < midnight)
{
Console.WriteLine("当前时间: " + now);
System.Threading.Thread.Sleep(1000); //程序暂停一秒
now = now.AddSeconds(1); //时间增加一秒
} //午夜零点小偷到达,看门狗引发Alarm事件
Console.WriteLine("/n月黑风高的午夜: " + now);
Console.WriteLine("小偷悄悄地摸进了主人的屋内... ");
dog.OnAlarm();
}
}
http://blog.csdn.net/Wiiix/article/details/51463977
下面再看一个例子:
在我们创建一个事件之前,我们需要一个委托,而一般标准的委托声明如下:
public delegate void EventHandler(object sender, System.EventArgs e);
第一个形参object sender定义了对象来源,第二个形参放的是继承自System.EventArgs的类,一般上这个类包含了事件的详细信息。
例子:
class ButtonEventArgs:EventArgs
{
public string time;
}
在这里我们不需要传递什么事件信息,所以我们用基类EventArgs就好。
public delegate void EventHandler(object sender, System.EventArgs e); class Publisher
{
public event EventHandler Added; //定义发生事件 protected virtual void OnAdded(System.EventArgs e) //当事件发生中触发方法
{
if(Added!=null)
{
Added(this, e);
}
}
public void Add(object value) //触发事件的方法
{ OnAdded(System.EventArgs.Empty);
}
} class Subscriber
{
void AddedEventHandler(object sender,System.EventArgs e)
{
System.Console.WriteLine("AddEvent occured");
} static void Main()
{
Subscriber s = new Subscriber();
Publisher p = new Publisher();
p.Added += s.AddedEventHandler;
p.Add();
}
}
事件的使用步骤如下:
存放事件的类
1.定义事件
2.触发事件的方法(protected)
3.间接触发事件的方法(public)
触发事件的类
1.定义方法
2.注册方法
3.触发方法
http://www.cnblogs.com/yinqixin/p/5067033.html
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace 自定义事件一
{
class Program
{
static void Main(string[] args)
{
Dog dog = new Dog();
Host host = new Host(dog );
DateTime now = new DateTime(, , , , , );
DateTime midnight = new DateTime(, , , , , );
while (now < midnight)
{
Console.WriteLine("当前时间" + now);
System.Threading.Thread.Sleep();
now = now.AddSeconds();
}
Console.WriteLine("\n月黑风高的午夜:" + now);
Console.WriteLine("小偷进了主人的屋内...........");
dog.OnAlarm();
Console.ReadKey();
}
}
class Dog
{
//第一:声明关于事件的委托
public delegate void AlarmEventHandler(object sender, EventArgs e);
//第二:声明事件
public event AlarmEventHandler Alarm;//前面的public没用,这个Alarm事件仍然是private的,可以在类外绑定方法,不能运行这个事件
//第三:编写引发shijian的函数
public void OnAlarm()
{
if (this.Alarm != null)
{
Console.WriteLine("\n狗报警,有小偷进来了,汪汪汪~~~");
this.Alarm(this, new EventArgs());//运行这个事件;this 当前对象,this.Alarm是当前对象多引用的事件
}
}
}
class Host
{
//第四:编写事件的处理程序
void HostHandeAlarm(object sender, EventArgs e)
{
Console.WriteLine("主人:抓住了小偷!~");
}
//第五:注册事件的处理程序
public Host(Dog dog)
{
dog.Alarm += new Dog.AlarmEventHandler(HostHandeAlarm);
}
} }
c#委托与事件2的更多相关文章
- .NET面试题系列[7] - 委托与事件
委托和事件 委托在C#中具有无比重要的地位. C#中的委托可以说俯拾即是,从LINQ中的lambda表达式到(包括但不限于)winform,wpf中的各种事件都有着委托的身影.C#中如果没有了事件,那 ...
- .NET基础拾遗(4)委托、事件、反射与特性
Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理基础 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开 ...
- [转载]C#深入分析委托与事件
原文出处: 作者:风尘浪子 原文链接:http://www.cnblogs.com/leslies2/archive/2012/03/22/2389318.html 同类链接:http://www.c ...
- [转载]C#委托和事件(Delegate、Event、EventHandler、EventArgs)
原文链接:http://blog.csdn.net/zwj7612356/article/details/8272520 14.1.委托 当要把方法作为实参传送给其他方法的形参时,形参需要使用委托.委 ...
- C#委托与事件
一.在控制台下使用委托和事件 我们都知道,C#中有"接口"这个概念,所谓的"接口"就是定义一套标准,然后由实现类来具体实现其中的方法,所以说"接口,是 ...
- C#委托与事件的简单使用
前言:上一篇博文从原理和定义的角度介绍了C#的委托和事件.本文通过一个简单的小故事,来说明C#委托与事件的使用方法及其方便之处. 在阅读本文之前,需要你对委托和事件的基本概念有所了解.如果你是初次接触 ...
- C#之委托与事件
委托与事件 废话一堆:网上关于委托.事件的文章有很多,一千个哈姆雷特就有一千个莎士比亚,以下内容均是本人个人见解. 1. 委托 1.1 委托的使用 这一小章来学习一下怎么简单的使用委托,了解一些基本的 ...
- [ASP.NET MVC 大牛之路]02 - C#高级知识点概要(1) - 委托和事件
在ASP.NET MVC 小牛之路系列中,前面用了一篇文章提了一下C#的一些知识点.照此,ASP.NET MVC 大牛之路系列也先给大家普及一下C#.NET中的高级知识点.每个知识点不太会过于详细,但 ...
- .NET委托和事件
.net学习之委托和事件 1.什么是委托 通俗的说:委托就是一个能够存储符合某种格式(方法签名)的方法的指针的容器 上传图片: 2.委托语法 准备一个方法:string Hello(string ...
- C#委托和事件
委托和事件都可以用来调用跟自己方法签名一样的方法,两者在使用中主要有以下区别: 委托和事件没有可比性,因为委托是类型,事件是对象: 委托可以在声明它的类外部进行调用,而事件只能在类的内部进行调用: 委 ...
随机推荐
- SHA1加密工具
package com.wx.project.util; import java.security.MessageDigest; /* * sha1 加密算法 * 网上copy 一大堆 */ publ ...
- log4j 产生的日志位置设置和catalina.home、catalina.base
方法一. 解决的办法自然是用相对路径代替绝对路径,其实log4j的FileAppender本身就有这样的机制,如:log4j.appender.logfile.File=${WORKDIR}/logs ...
- jq里面关于disable的用法
//两种方法设置disabled属性$('#areaSelect').attr("disabled",true);$('#areaSelect').attr("disab ...
- PHP守护进程化
什么是守护进程? 一个守护进程通常补认为是一个不对终端进行控制的后台任务.它有三个很显著的特征:在后台运行,与启动他的进程脱离,无须控制终端.常用的实现方式是fork() -> setsid() ...
- 在微信小程序中调用本地接口
1.点击详情,并勾选项目设置中最后一行. 2.用小程序请求本地的后台服务接口 wx.request({ url: 'http://localhost:8090/DemoProject/myTest.d ...
- os模块。笔记
os 模块提供了很多允许你的程序与操作系统直接交互的功能 得到当前工作目录,即当前Python脚本工作的目录路径: os.getcwd() 返回指定目录下的所有文件和目录名:os.listdir() ...
- Excel怎么下拉框多选
打开Exlce, 确定,然后 右击查看代码,把这段代码复制到新建的文件里面 此时Excel会给出提示,选择否,,系统会提示保存,在保存的时候选择启用宏的工作簿然后保存,此时Excel下拉框多选就搞定了 ...
- CBV FBV rest framework
CBV与FBV restful协议 ---- 一切皆是资源,操作只是请求方式 ----book表增删改查 /books/ books /books/add/ addbook /books/(\d+)/ ...
- 21.Mysql Server优化
21.优化Mysql Server21.1 Mysql体系结构概览Mysql由Mysql Server层和存储引擎层组成.Mysql实例由一组后台进程.一写内存块和若干服务线程组成.Mysql后台进程 ...
- 多进程copy文件
from multiprocessing import Pool,Manager import os,time def copyFileTask(fileName,oldFolderName,newF ...