首先是一个关机器的一般方法:

 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的更多相关文章

  1. .NET面试题系列[7] - 委托与事件

    委托和事件 委托在C#中具有无比重要的地位. C#中的委托可以说俯拾即是,从LINQ中的lambda表达式到(包括但不限于)winform,wpf中的各种事件都有着委托的身影.C#中如果没有了事件,那 ...

  2. .NET基础拾遗(4)委托、事件、反射与特性

    Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理基础 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开 ...

  3. [转载]C#深入分析委托与事件

    原文出处: 作者:风尘浪子 原文链接:http://www.cnblogs.com/leslies2/archive/2012/03/22/2389318.html 同类链接:http://www.c ...

  4. [转载]C#委托和事件(Delegate、Event、EventHandler、EventArgs)

    原文链接:http://blog.csdn.net/zwj7612356/article/details/8272520 14.1.委托 当要把方法作为实参传送给其他方法的形参时,形参需要使用委托.委 ...

  5. C#委托与事件

    一.在控制台下使用委托和事件 我们都知道,C#中有"接口"这个概念,所谓的"接口"就是定义一套标准,然后由实现类来具体实现其中的方法,所以说"接口,是 ...

  6. C#委托与事件的简单使用

    前言:上一篇博文从原理和定义的角度介绍了C#的委托和事件.本文通过一个简单的小故事,来说明C#委托与事件的使用方法及其方便之处. 在阅读本文之前,需要你对委托和事件的基本概念有所了解.如果你是初次接触 ...

  7. C#之委托与事件

    委托与事件 废话一堆:网上关于委托.事件的文章有很多,一千个哈姆雷特就有一千个莎士比亚,以下内容均是本人个人见解. 1. 委托 1.1 委托的使用 这一小章来学习一下怎么简单的使用委托,了解一些基本的 ...

  8. [ASP.NET MVC 大牛之路]02 - C#高级知识点概要(1) - 委托和事件

    在ASP.NET MVC 小牛之路系列中,前面用了一篇文章提了一下C#的一些知识点.照此,ASP.NET MVC 大牛之路系列也先给大家普及一下C#.NET中的高级知识点.每个知识点不太会过于详细,但 ...

  9. .NET委托和事件

    .net学习之委托和事件   1.什么是委托 通俗的说:委托就是一个能够存储符合某种格式(方法签名)的方法的指针的容器 上传图片: 2.委托语法 准备一个方法:string Hello(string ...

  10. C#委托和事件

    委托和事件都可以用来调用跟自己方法签名一样的方法,两者在使用中主要有以下区别: 委托和事件没有可比性,因为委托是类型,事件是对象: 委托可以在声明它的类外部进行调用,而事件只能在类的内部进行调用: 委 ...

随机推荐

  1. 【linux C】C语言中常用的几个函数的总结【二】

    3.fgets 虽然用 gets() 时有空格也可以直接输入,但是 gets() 有一个非常大的缺陷,即它不检查预留存储区是否能够容纳实际输入的数据,换句话说,如果输入的字符数目大于数组的长度,get ...

  2. LRU缓存原理

    LRU(Least Recently Used)  LRU是近期最少使用的算法,它的核心思想是当缓存满时,会优先淘汰那些近期最少使用的缓存对象. 采用LRU算法的缓存有两种:LrhCache和DisL ...

  3. php 图像处理函数

    gd_info       函数:获取当前安装的GD库的信息 getimagesize  函数:获取图像的大小 image_type_to_extension   函数:获取图像类型的文件后缀 ima ...

  4. VS2013中Nuget程序包管理器控制台使用入门(二)-如何使用Nuget提供的帮助(原创)

    如何使用Nuget提供的帮助? 1.从get-help Nuget开始,键入“get-help NuGet”以查看所有可用的 NuGet 命令. 用法: PM> get-help Nuget 主 ...

  5. Jmeter常用脚本开发之Java请求

    Java请求:就是用来对java项目的类进行压测 例子:将输入的两个参数通过IO存入文件 1.创建Java工程,工程目录如下 2.将Jmeter-lib下面的所有jar包导入java工程, 3.创建一 ...

  6. Linux Centos7 虚拟机上网设置

    一.Windows下网卡,共享上网模式 二.虚拟机VMnet8的网卡模 三.Linux 下配置网卡 命令: vi /etc/sysconfig/network-scripts/ifcfg-ens33 ...

  7. Hadoop(二) HADOOP集群搭建(简化版)

    1.准备Linux环境    1.0先将虚拟机的网络模式选为NAT            1.1修改主机名        vi /etc/sysconfig/network               ...

  8. phpstorm的安装和使用

    1下载phpstorm #下载地址 https://www.jetbrains.com/phpstorm/ 2激活并安装 create associations 表示的是以后编辑选择的文件也默认用id ...

  9. 如何选择稳定的PHP虚拟主机?

    先评估自己的业务量有多大如果是新站且流量和数据量都不大的话,建议刚开始先购买低配的即可,待流量逐渐增大时在逐渐升级,灵活又省钱 带宽的限制 虚拟主机带宽是指同一时间内所能承载的数据的能力,直接关系大虚 ...

  10. UEFI、BIOS、Secure Boot的关系和知识介绍

      从Windows 8操作系统时代开始,安装操作系统的方法也有了很大的改变,Windows 8采用了Secure Boot引导启动的方式,而不是过去Win XP和Win 7的Legacy启动方式,从 ...