I was thinking that the previous post on Events and Delegates was quite self-explanatory. A couple of days ago, I received an email which said that may be it is not that good as to explain what I want to achieve in life through that event. So, I thought why not write another post on Delegates and Events to make things clearer from a practical (or may be not so practical, "BUT" just another simple and practical example. There is no harm in trying, after all...)

Here is the requirement...

You have a class with a special number. You have another (or may be a lot of other) class which is using it. The requirement now is that, whenever the special number is changed, all the other guys should be notified about what this number was and what it has become!

In this case,

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace EventAndDelegateDemo
{
//There are 3 rules which are MANDATORY when you are planning to create events
//Rule 1> The delegate must be defined with two arguments
//Rule 2> These arguments always represent TWO objects…
// The Publisher (object that raised the event)
// Event Information object
//Rule 3> The 2nd object HAS to be derived from EventArgs //Step 1> Create a class that inherits from EventArgs (To comply with Rule 3)
class NotifyChangeEventArgs : EventArgs
{
//constructor to initialize the SpecialNumberOld and SpecialNumberNew property
public NotifyChangeEventArgs(int SpecialNumberOld, int SpecialNumberNew)
{
this.SpecialNumberNew = SpecialNumberNew;
this.SpecialNumberOld = SpecialNumberOld;
}
public int SpecialNumberNew { get; set; }
public int SpecialNumberOld { get; set; }
}; class SpecialNumberClass // Publisher
{
//Publisher declares a special delegate and event (Rule 1 & 2)
public delegate void SpecialNumberHandler(object source, NotifyChangeEventArgs e);
public event SpecialNumberHandler OnSpecialNumberUpdate; //Constructor to set the value of the _specialNumber directly.
//Notice that we are not setting the SpecialNumber property!
public SpecialNumberClass(int number)
{
_specialNumber = number;
} //This property will fire an event called OnSpecialNumberUpdate whenever called
//The effect is that is the special number is changed from outside, all the guys
//would be notified. It is upto them to listen to it or not listen to it.
private int _specialNumber;
public int SpecialNumber
{
get { return _specialNumber; }
//Put a breakpoint here on set and step into (F11)
set
{
if (OnSpecialNumberUpdate != null)
{
//This is the guy who would fire that notify event called OnSpecialNumberUpdate
//Basically, before you fire that event, you can set up that value for EventArgs
//In my case, I have set the value of e's old value and new value...
//to the _specialNumber and value (which would be the new value)
//Notice that we are just firing the events with appropriate EventArgs...
//We haven't thrown any output as such yet!!!!
NotifyChangeEventArgs e = new NotifyChangeEventArgs(_specialNumber, value);
Console.WriteLine("Raising Events to all the subscribers...\n");
OnSpecialNumberUpdate(this, e);
}
}
}
}; class SpecialNumberUpdateListener // Subscriber
{
//Here we are just creating a new Object called objSN for my SpecialNumberClass
SpecialNumberClass objSN; //In this method, I would go ahead and bind my event
public SpecialNumberUpdateListener(SpecialNumberClass spClass)
{
Console.WriteLine("SpecialNumber listener > Subscribing to the event...\n");
this.objSN = spClass; //Wiring the event so that the event is fired
spClass.OnSpecialNumberUpdate += new SpecialNumberClass.SpecialNumberHandler(OnSpecialNumberUpdate);
} //This is the event that would be invoked whenever you change the value
//Try putting a break point here and see how it gets hit when the number changes
//Also notice how we use the Event args to grab the details and finally print it out
void OnSpecialNumberUpdate(object source, NotifyChangeEventArgs e)
{
Console.WriteLine("The number has changed from {0} to {1} ", e.SpecialNumberOld, e.SpecialNumberNew);
}
} class EventDemo
{
public static void Main()
{
//Creating a new Special Number (Publisher) class with initial value of 20
SpecialNumberClass snc = new SpecialNumberClass();
//Creating a Subscriber/listener class
SpecialNumberUpdateListener s = new SpecialNumberUpdateListener(snc);
//Changing the value so that the event is triggered.
//Put a breakpoint and step into the code (F11)
snc.SpecialNumber = ;
Console.ReadLine();
}
}
}

转:http://www.dotnetscraps.com/dotnetscraps/post/Explaining-Delegates-in-C-Part-3-(Events-again).aspx

Explaining Delegates in C# - Part 3 (Events 2)的更多相关文章

  1. Explaining Delegates in C# - Part 2 (Events 1)

    In my previous post, I spoke about a few very basic and simple reasons of using delegates - primaril ...

  2. Explaining Delegates in C# - Part 1 (Callback and Multicast delegates)

    I hear a lot of confusion around Delegates in C#, and today I am going to give it shot of explaining ...

  3. Explaining Delegates in C# - Part 6 (Asynchronous Callback - Way 3)

    By now, I have shown the following usages of delegates... Callback and Multicast delegatesEventsOne ...

  4. Explaining Delegates in C# - Part 4 (Asynchronous Callback - Way 1)

    So far, I have discussed about Callback, Multicast delegates, Events using delegates, and yet anothe ...

  5. Explaining Delegates in C# - Part 7 (Asynchronous Callback - Way 4)

    This is the final part of the series that started with... Callback and Multicast delegatesOne more E ...

  6. Explaining Delegates in C# - Part 5 (Asynchronous Callback - Way 2)

    In this part of making asynchronous programming with delegates, we will talk about a different way, ...

  7. 11.Events

    1.A type that defines an event member allows the type (or instances of the type) to notify other obj ...

  8. VB.NET vs. C#

    VB.NET Program Structure C# Imports System Namespace Hello    Class HelloWorld        Overloads Shar ...

  9. [转]c#.NET和VB.NET语法的比较

    本文转自:http://www.cnblogs.com/lify0407/archive/2007/08/01/838589.html c#.NET和VB.NET语法的比较   VB.NET C# C ...

随机推荐

  1. Java线程与锁

    概要:线程的实现方法. 线程调度.线程状态及转换.线程安全(5种分类.3种实现方法.锁优化技术) 进程是OS进行资源分配的基本单位,线程是CPU调度的基本单位. 1.线程的实现方法 可参阅 我是一个进 ...

  2. 代码动态设置edittext输入类型为密码类型

    开发中常常会用到EditText输入框,要将他的输入类型设置为密码输入,但是直接在布局文件中设置时,hint字体风格就会不一样 例如,在布局文件中直接设置是这样的(如下图),字体风格明显跟上一行的不一 ...

  3. 分享:10 大顶级开源 ERP 系统

    10 大顶级开源 ERP 系统 企业资源规划(ERP)和客户关系管理(CRM)系统现在已经成为各种组织和企业的必需品,通过它们,可以轻松实现企业的信息数据标准化.系统运行集成化.业务流程合理化.绩效监 ...

  4. Java Management Extensions (JMX) - Best Practices 最佳实践

    Java Management Extensions (JMX) - Best Practices 注意,本文一些管理可能与JMX API或JSR 77 (J2EE management)不一致.它们 ...

  5. 第三百二十四节,web爬虫,scrapy模块介绍与使用

    第三百二十四节,web爬虫,scrapy模块介绍与使用 Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 其可以应用在数据挖掘,信息处理或存储历史数据等一系列的程序中.其最初是为了 ...

  6. C++ 查询某个变量的类型

    #include <typeinfo> int iii = 100; printf("%s\n",typeid(iii).name());//类型 详见:http:// ...

  7. Java如何显示小时和分钟?

    在Java中,如何显示小时和分钟(当前时间)? 此示例演示如何使用Calender类的Calender.getInstance()来显示某个时刻的小时和分钟. package com.yiibai; ...

  8. Maven存储库

    什么是Maven资源库? 在 Maven 术语里存储库是一个目录,即目录中保存所有项目的 jar 库,插件或任何其他项目特定文件,并可以容易由 Maven 使用. Maven库中有三种类型 local ...

  9. e791. 为JSpinner定制编辑器

    This example replaces the default editor (a JFormattedTextField) in a spinner component with a custo ...

  10. 详解SQLServer如何链接远程MySQL数据库

    最近遇到“SQL如何链接远程MySQL”这个问题,现在问题终于解决,特把方法贴出来:(我所用的操作系统是Win7,数据库是SQL2005.) 1.在SQL SERVER服务器上安装MYSQL ODBC ...