//public event SecondChangeHandler OnSecondChange; 若将委托加上event,则视作是事件,不是委托,外围就不能直接对OnSecondChange传值

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading; namespace EventClock
{
//一个存放事件信息的类
//存放这Clock类中的信息,和其他状态信息
public class TimeInfoEventArg : EventArgs
{
public TimeInfoEventArg(int hour, int minute, int second)
{
this.hour = hour;
this.minute = minute;
this.second = second;
}
public readonly int hour;
public readonly int minute;
public readonly int second;
} //中心类:其他类要订阅的类
//发布一个委托
//OnSecondChange
public class Clock
{
private int hour;
private int minute;
private int second;
//订阅这必须实现的委托
public delegate void SecondChangeHandler(object clcok, TimeInfoEventArg timeInformation);
//委托实例
public SecondChangeHandler OnSecondChange; //设置始终运行,每一秒都触发一个事件
public void Run()
{
for (; ; )
{
//休眠10秒
Thread.Sleep(10);
//获取当前时间
System.DateTime dt = System.DateTime.Now;
//如秒钟改变,通知订阅者
if (dt.Second != second)
{
//创建TimeInfoEventArg对象,传给订阅者
TimeInfoEventArg timeInformation = new TimeInfoEventArg(dt.Hour,dt.Minute,dt.Second);
//如果有订阅者,通知他们
if (OnSecondChange != null)
{
OnSecondChange(this, timeInformation);
} }
this.second = dt.Second;
this.minute = dt.Minute;
this.hour = dt.Hour;
}
}
}
//一个订阅者,DisplayClock订阅
//时钟事件,DisplayClock任务是显示当前时间
public class DisplayClock
{
//对于给定的时钟,订阅其他OnSecondChange事件
public void Subscribe(Clock theClock)
{
theClock.OnSecondChange += new Clock.SecondChangeHandler(TimeHasChanged); } //实现委托功能的方法
public void TimeHasChanged(object clcok, TimeInfoEventArg timeInformation)
{
Console.WriteLine("Current time: {0}:{1}:{2}",
timeInformation.hour.ToString(),
timeInformation.minute.ToString(),
timeInformation.second.ToString());
}
} //另一个订阅者,其任务写入文件
public class LogCurrentTime
{
public void Subscribe(Clock theClock)
{
theClock.OnSecondChange += new Clock.SecondChangeHandler(WriteLogEntry);
}
//此方法应该写入文件
//写到控制台是为了看到对象不保存状态的效果
public void WriteLogEntry(
object theClcok, TimeInfoEventArg ti)
{
Console.WriteLine("logging to file: {0}:{1}:{2}",
ti.hour.ToString(), ti.minute.ToString(), ti.second.ToString());
}
} class Program
{
static void Main(string[] args)
{
Clock theClock = new Clock(); //创建时钟对象,订阅刚刚创建的时钟
DisplayClock dc = new DisplayClock();
dc.Subscribe(theClock);
//创建Log对对象
LogCurrentTime lct = new LogCurrentTime();
lct.Subscribe(theClock); theClock.Run();
Console.ReadLine();
}
}
}
//匿名方法,无需在注册实例委托
        public void Subscribe(Clock theClock)
{
theClock.OnSecondChange += delegate(object clcok, TimeInfoEventArg timeInformation)
{
Console.WriteLine("Current time: {0}:{1}:{2}",
timeInformation.hour.ToString(),
timeInformation.minute.ToString(),
timeInformation.second.ToString());
}; }

C#_delegate - 用委托实现事件,Display和Log类都使用Clock对象的更多相关文章

  1. Silverlight项目笔记1:UI控件与布局、MVVM、数据绑定、await/async、Linq查询、WCF RIA Services、序列化、委托与事件

    最近从技术支持转到开发岗,做Silverlight部分的开发,用的Prism+MVVM,框架由同事搭好,目前做的主要是功能实现,用到了一些东西,侧重于如何使用,总结如下 1.UI控件与布局 常用的主要 ...

  2. C#委托与事件学习笔记

    委托事件学习笔记 本文是学习委托和事件的笔记,水平有限,如有错漏之处,还望大神不吝赐教. 什么是委托?从字面意思来解释,就是把一个动作交给别人去执行.在实际开发中最常用的就是使一个方法可以当做一个参数 ...

  3. C# 关于委托和事件的妙文:通过一个例子详细介绍委托和事件的作用;Observer模式简介

    委托和事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去的人每次见 ...

  4. c#委托、事件、Observer

    委托和事件在.NET Framework[1] 中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易. 中文名 委托 外文名 Delegate 编程语言 C# 作     ...

  5. c#关于委托和事件(二)(介绍的很详细)

    using System;using System.Collections.Generic;using System.Text; namespace Delegate {    // 热水器    p ...

  6. 通俗理解C#委托和事件

    引言 委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去 ...

  7. C# 关于委托和事件的妙文

    C# 关于委托和事件的妙文: 通过一个例子详细介绍委托和事件的作用:Observer模式简介 转自:http://blog.csdn.net/susan19890313/article/details ...

  8. C#委托及事件

    转载:http://www.cnblogs.com/warensoft/archive/2010/03/19/1689806.html C#委托及事件 在C#中,委托(delegate)是一种引用类型 ...

  9. .Net之美读书系列(一):委托与事件

    开启新的读书之旅,这次读的书为<.Net之美:.Net关键技术深入解析>. 我是选择性阅读的,把一些自己觉得容易忘记的,或者比较重要的知识点记录下来,以便以后能方便呢查阅. 尊重书本原作者 ...

随机推荐

  1. ORACLE:profile的管理

    PROFILE的管理(资源文件)      当需要设置资源限制时,必须设置数据库系统启动参数RESOURCE_LIMIT,此参数默认值为FALSE      可以使用如下命令来启动当前资源限制:    ...

  2. java中接口与多重继承的关系

    在Java语言中, abstract class 和interface 是支持抽象类定义的两种机制.正是由于这两种机制的存在,才赋予了Java强大的 面向对象能力.abstract class和int ...

  3. codeforce 606B Testing Robots

    题意:给定一个x*y的矩形,和一个机器人的初始位置(x0,y0).以向下为x轴正方向,向右为y轴正方向.现在要对这个机器人进行多次测试.每次测 试,会在矩形的某个位置有一个矿井.所以一共要进行x*y次 ...

  4. 用python的numpy作线性拟合、多项式拟合、对数拟合

    转自:http://blog.itpub.net/12199764/viewspace-1743145/ 项目中有涉及趋势预测的工作,整理一下这3种拟合方法:1.线性拟合-使用mathimport m ...

  5. Mongodb 和 普通数据库 各种属性 和语句 的对应

    SQL to MongoDB Mapping Chart In addition to the charts that follow, you might want to consider the F ...

  6. Excel里的单元格提行

    最近老板发了个表,遇到了个小知识点,收藏以后有用!拿来学学 如下,是属于单元格.怎么提行? 直接,空格或space,都无法解决!...... 解决办法:Alt + Enter 成功! 参考: http ...

  7. 关于UIImage类的对象两种初始化方法的区别

    1.imageNamed: UIImage *image = [UIImage imageNamed:"]; UIImage的类方法 第一次读取图片的时候,先把这个图片放到缓存中,下次再使用 ...

  8. Activity详解

    Activity是android应用的重要组成单元之一(另外3个是Service,BroadcastReceiver和ContentProvider).实际应用包含了多个Activity,不同的Act ...

  9. Oracle函数汇总

    日期函数 1. select sysdate from dual 查询当前日期 2. select months_between() from dual 查询两个日期的月份差 3. select ad ...

  10. ECSHOP在线手册布局参考图--通用活动页 group_list.dwt等

        A.购物车 1,设置方法 程序自动读取购物车的商品数量 2,代码相关 cart.lbi 中 {insert_scripts files='transport.js'} <div clas ...