//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. 【转】android开发工具Eclipse,androidStudio,adt网盘下载--不错

    原文网址:http://tools.android-studio.org/index.php/85-tools/109-android-tools-download

  2. SharePoint 2010 master page 控件介绍(1)

    转:http://blog.csdn.net/lgm97/article/details/6409204 以下所有的内容都是根据Randy Drisgill (MVP SharePoint Serve ...

  3. [Bhatia.Matrix Analysis.Solutions to Exercises and Problems]PrI.6.1

    Given a basis $U=(u_1,\cdots,u_n)$ not necessarily orthonormal, in $\scrH$, how would you compute th ...

  4. Breaking parallel loops in .NET C# using the Stop method z

    List<, , , , , , , , , }; Parallel.ForEach(integers, (int item, ParallelLoopState state) => { ...

  5. HDU 3001 Travelling 3进制状压dp

    题意:10个点,若干条边,边有花费,每个点最多走两次,求走过所有点,花费最少 分析:因为每个点最多走两次,所以联想到3进制,然后枚举状态,就行了(我也是照着网上大神的代码写的) #include &l ...

  6. JS实现网页下载[转]

    function downloadById() {        var url = "http://localhost:64610/WorkProcess/ResumeDetail/7&q ...

  7. FZU 2125 简单的等式

    Problem Description 现在有一个等式如下:x^2+s(x,m)x-n=0.其中s(x,m)表示把x写成m进制时,每个位数相加的和.现在,在给定n,m的情况下,求出满足等式的最小的正整 ...

  8. bzoj 1060 [ZJOI2007]时态同步(树形DP)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1060 [题意] 求最少的增加量,使得以rt为根的树中由一个结点出发的所有到叶子结点的路 ...

  9. NOIP2011 铺地毯

    1铺地毯 题目描述 为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯.一共有 n 张地毯,编号从 1 到n .现在将这些地毯按照编号从小到大的 ...

  10. CentOS安装nvidia显卡驱动

    1.下载 nvidia 相应的驱动: 2.修改/etc/modprobe.d/blacklist.conf文件,在里面加入blacklist nouveau. 3.重建image $ mv /boot ...