//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. 【转】Application.mk 文件语法规范

    原文网址:http://blog.sina.com.cn/s/blog_4c451e0e0100s6q4.html Application.mk file syntax specification A ...

  2. c#保存datagridview中的数据时报错 “动态SQL生成失败。找不到关键信息”

    ilovejinglei 原文 C#中保存datagridview中的数据时报错"动态SQL生成失败.找不到关键信息" 问题描述     相关代码 using System; us ...

  3. jquery日历datepicker的使用方法

    jquery.ui.datepicker.js 用法: http://blog.csdn.net/zb0567/article/details/7906238   原文  http://blog.cs ...

  4. Eclipse(非J2EE版本)配置Extjs环境以及安装部署Tomcat

    Eclipse(非J2EE版本)配置Extjs环境(Spket) 1. 安装spket插件,帮助->安装新软件->http://www.agpad.com/update. 2. 设置Spk ...

  5. DOS命令关闭进程

    1.开始-运行,输入cmd后回车; 2.在DOS提示符下,先用命令 tasklist 回车来获取进程的 PID(例如获取了Explorer.EXE进程的PID为1988); 3.然后再输入命令:tas ...

  6. 关于win10安装VisualSVN遇到的一个问题及解决办法

    问题:在win10系统中安装VisaulSVN遇到问题,错误提示:There is problem with this Windows Installer package. A DLL require ...

  7. leetcode@ [279]Perfect Squares

    https://leetcode.com/problems/perfect-squares/ Given a positive integer n, find the least number of ...

  8. HDU2686-Matrix & HDU3376-Matrix Again(费用流)

    比较简单的题了. 只需从左上角到右下角找两条路就可以了. 因为每个点只能走一次,所以拆点,限制流量为1. 因为求的是最大值,所以权值取反求最小值. 因为第一个点和最后一个点经过两次,只算一次,最后要减 ...

  9. MariaDB-5.5.32源码编译安装

    MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可.开发这个分支的原因之一是:Oracle公司收购了MySQL后,有将MySQL闭源的潜在风险,因此社区采用分 ...

  10. 做优步有什么旁门左道吗?No,贪小便宜会吃大亏!

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...