//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. UVA 1637 Double Patience

    题意:36张扑克,平分成9摞,两张数字一样的可以拿走,每次随机拿两张,问能拿光的概率. 解法:记忆化搜索,状态压缩.一开始我想在还没拿的时候概率是1,然后往全拿光推···样例过不去···后来觉得推反了 ...

  2. 29、activity横竖屏切换细节问题

    1 import android.app.Activity; import android.content.Intent; import android.os.Bundle; import andro ...

  3. 第一章 Lambda表达式

    1.1 Why Lambdas? 当你操作多线程的时候,你会像下面这样将要处理的代码放到run()函数中: class Worker implements Runnable { public void ...

  4. opencv 在工业中的应用:圆孔定位

    在工业中产品或者夹具上经常有圆形孔,我们可以利用这些孔来对产品或者夹具进行定位.我用OPENCV写了个DEMO 程序,介绍如下: (1)首先点击打开图像按钮打开一幅图像 (2)进行一些参数设置 (3) ...

  5. 判断一个面(Polygon)是不是矩形

    判断一个面是不是矩形在GIS中很长用的功能,那么怎么判断一个面是不是矩形呢. 这里先要弄懂一些概念,面是什么,先看OGC标准的定义. 我的英文水平有限,(有翻译更好的请留言,如果翻译的准确将被采纳)大 ...

  6. PDF/WORD/EXCEL 图片预览

    一.PDF/WORD/EXCEL 转 XPS 转 第一页内容 转 图片 WORD.EXCEL转XPS (Office2010) public bool WordToXPS(string sourceP ...

  7. Mac java环境配置

    进入命令行 cd ~ touch .bash_profile vi .bash_profile 输入内容jdk变量配置内容: export JAVA_HOME=/Library/Java/JavaVi ...

  8. HDU-4662 MU Puzzle 水题

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4662 倒推考虑长度就可以了. //STATUS:C++_AC_31MS_240KB #include ...

  9. Java HashMap 核心源码解读

    本篇对HashMap实现的源码进行简单的分析. 所使用的HashMap源码的版本信息如下: /* * @(#)HashMap.java 1.73 07/03/13 * * Copyright 2006 ...

  10. opencv 图像轮廓

    图片解析: 原图: code: #include <opencv\cv.h> #include <opencv\highgui.h> #include <opencv\c ...