<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://nfex.ru/index.php?action=history&amp;feed=atom&amp;title=Csharp%2FC_Sharp%2FLanguage_Basics%2Fdelegate_Event</id>
		<title>Csharp/C Sharp/Language Basics/delegate Event - История изменений</title>
		<link rel="self" type="application/atom+xml" href="http://nfex.ru/index.php?action=history&amp;feed=atom&amp;title=Csharp%2FC_Sharp%2FLanguage_Basics%2Fdelegate_Event"/>
		<link rel="alternate" type="text/html" href="http://nfex.ru/index.php?title=Csharp/C_Sharp/Language_Basics/delegate_Event&amp;action=history"/>
		<updated>2026-04-30T01:05:37Z</updated>
		<subtitle>История изменений этой страницы в вики</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://nfex.ru/index.php?title=Csharp/C_Sharp/Language_Basics/delegate_Event&amp;diff=682&amp;oldid=prev</id>
		<title> в 15:31, 26 мая 2010</title>
		<link rel="alternate" type="text/html" href="http://nfex.ru/index.php?title=Csharp/C_Sharp/Language_Basics/delegate_Event&amp;diff=682&amp;oldid=prev"/>
				<updated>2010-05-26T15:31:18Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr style=&quot;vertical-align: top;&quot; lang=&quot;ru&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;← Предыдущая&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;Версия 15:31, 26 мая 2010&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; style=&quot;text-align: center;&quot; lang=&quot;ru&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(нет различий)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
			</entry>

	<entry>
		<id>http://nfex.ru/index.php?title=Csharp/C_Sharp/Language_Basics/delegate_Event&amp;diff=683&amp;oldid=prev</id>
		<title>Admin: 1 версия</title>
		<link rel="alternate" type="text/html" href="http://nfex.ru/index.php?title=Csharp/C_Sharp/Language_Basics/delegate_Event&amp;diff=683&amp;oldid=prev"/>
				<updated>2010-05-26T11:39:29Z</updated>
		
		<summary type="html">&lt;p&gt;1 версия&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;==A class receives the notification when      a static method is used as an event handler==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
C#: The Complete Reference &lt;br /&gt;
by Herbert Schildt &lt;br /&gt;
Publisher: Osborne/McGraw-Hill (March 8, 2002)&lt;br /&gt;
ISBN: 0072134852&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
/* A class receives the notification when  &lt;br /&gt;
   a static method is used as an event handler. */ &lt;br /&gt;
  &lt;br /&gt;
using System; &lt;br /&gt;
 &lt;br /&gt;
// Declare a delegate for an event.  &lt;br /&gt;
delegate void MyEventHandler(); &lt;br /&gt;
 &lt;br /&gt;
// Declare an event class. &lt;br /&gt;
class MyEvent { &lt;br /&gt;
  public event MyEventHandler SomeEvent; &lt;br /&gt;
 &lt;br /&gt;
  // This is called to fire the event. &lt;br /&gt;
  public void OnSomeEvent() { &lt;br /&gt;
    if(SomeEvent != null) &lt;br /&gt;
      SomeEvent(); &lt;br /&gt;
  } &lt;br /&gt;
} &lt;br /&gt;
 &lt;br /&gt;
class X { &lt;br /&gt;
 &lt;br /&gt;
  /* This is a static method that will be used as &lt;br /&gt;
     an event handler. */ &lt;br /&gt;
  public static void Xhandler() { &lt;br /&gt;
    Console.WriteLine(&amp;quot;Event received by class.&amp;quot;); &lt;br /&gt;
  } &lt;br /&gt;
} &lt;br /&gt;
 &lt;br /&gt;
public class EventDemo3 { &lt;br /&gt;
  public static void Main() {  &lt;br /&gt;
    MyEvent evt = new MyEvent(); &lt;br /&gt;
 &lt;br /&gt;
    evt.SomeEvent += new MyEventHandler(X.Xhandler); &lt;br /&gt;
 &lt;br /&gt;
    // Fire the event. &lt;br /&gt;
    evt.OnSomeEvent(); &lt;br /&gt;
  } &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
           &lt;br /&gt;
       &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==An event multicast demonstration==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
C#: The Complete Reference &lt;br /&gt;
by Herbert Schildt &lt;br /&gt;
Publisher: Osborne/McGraw-Hill (March 8, 2002)&lt;br /&gt;
ISBN: 0072134852&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
// An event multicast demonstration. &lt;br /&gt;
  &lt;br /&gt;
using System; &lt;br /&gt;
 &lt;br /&gt;
// Declare a delegate for an event.  &lt;br /&gt;
delegate void MyEventHandler(); &lt;br /&gt;
 &lt;br /&gt;
// Declare an event class. &lt;br /&gt;
class MyEvent { &lt;br /&gt;
  public event MyEventHandler SomeEvent; &lt;br /&gt;
 &lt;br /&gt;
  // This is called to fire the event. &lt;br /&gt;
  public void OnSomeEvent() { &lt;br /&gt;
    if(SomeEvent != null) &lt;br /&gt;
      SomeEvent(); &lt;br /&gt;
  } &lt;br /&gt;
} &lt;br /&gt;
 &lt;br /&gt;
class X { &lt;br /&gt;
  public void Xhandler() { &lt;br /&gt;
    Console.WriteLine(&amp;quot;Event received by X object&amp;quot;); &lt;br /&gt;
  } &lt;br /&gt;
} &lt;br /&gt;
 &lt;br /&gt;
class Y { &lt;br /&gt;
  public void Yhandler() { &lt;br /&gt;
    Console.WriteLine(&amp;quot;Event received by Y object&amp;quot;); &lt;br /&gt;
  } &lt;br /&gt;
} &lt;br /&gt;
 &lt;br /&gt;
public class EventDemo1 { &lt;br /&gt;
  static void handler() { &lt;br /&gt;
    Console.WriteLine(&amp;quot;Event received by EventDemo&amp;quot;); &lt;br /&gt;
  } &lt;br /&gt;
 &lt;br /&gt;
  public static void Main() {  &lt;br /&gt;
    MyEvent evt = new MyEvent(); &lt;br /&gt;
    X xOb = new X(); &lt;br /&gt;
    Y yOb = new Y(); &lt;br /&gt;
 &lt;br /&gt;
    // Add handlers to the event list. &lt;br /&gt;
    evt.SomeEvent += new MyEventHandler(handler); &lt;br /&gt;
    evt.SomeEvent += new MyEventHandler(xOb.Xhandler); &lt;br /&gt;
    evt.SomeEvent += new MyEventHandler(yOb.Yhandler); &lt;br /&gt;
 &lt;br /&gt;
    // Fire the event. &lt;br /&gt;
    evt.OnSomeEvent(); &lt;br /&gt;
    Console.WriteLine(); &lt;br /&gt;
 &lt;br /&gt;
    // Remove a handler. &lt;br /&gt;
    evt.SomeEvent -= new MyEventHandler(xOb.Xhandler); &lt;br /&gt;
    evt.OnSomeEvent(); &lt;br /&gt;
  } &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
           &lt;br /&gt;
       &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==A very simple event demonstration==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
C#: The Complete Reference &lt;br /&gt;
by Herbert Schildt &lt;br /&gt;
Publisher: Osborne/McGraw-Hill (March 8, 2002)&lt;br /&gt;
ISBN: 0072134852&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
// A very simple event demonstration. &lt;br /&gt;
  &lt;br /&gt;
using System; &lt;br /&gt;
 &lt;br /&gt;
// Declare a delegate for an event.  &lt;br /&gt;
delegate void MyEventHandler(); &lt;br /&gt;
 &lt;br /&gt;
// Declare an event class. &lt;br /&gt;
class MyEvent { &lt;br /&gt;
  public event MyEventHandler SomeEvent; &lt;br /&gt;
 &lt;br /&gt;
  // This is called to fire the event. &lt;br /&gt;
  public void OnSomeEvent() { &lt;br /&gt;
    if(SomeEvent != null) &lt;br /&gt;
      SomeEvent(); &lt;br /&gt;
  } &lt;br /&gt;
} &lt;br /&gt;
 &lt;br /&gt;
public class EventDemo { &lt;br /&gt;
  // An event handler. &lt;br /&gt;
  static void handler() { &lt;br /&gt;
    Console.WriteLine(&amp;quot;Event occurred&amp;quot;); &lt;br /&gt;
  } &lt;br /&gt;
 &lt;br /&gt;
  public static void Main() {  &lt;br /&gt;
    MyEvent evt = new MyEvent(); &lt;br /&gt;
 &lt;br /&gt;
    // Add handler() to the event list. &lt;br /&gt;
    evt.SomeEvent += new MyEventHandler(handler); &lt;br /&gt;
 &lt;br /&gt;
    // Fire the event. &lt;br /&gt;
    evt.OnSomeEvent(); &lt;br /&gt;
  } &lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
           &lt;br /&gt;
       &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Chaining events.==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
using System;&lt;br /&gt;
public class EventTestClass {&lt;br /&gt;
    private int nValue;&lt;br /&gt;
    public delegate void ValueChangedEventHandler();&lt;br /&gt;
    public event ValueChangedEventHandler Changed;&lt;br /&gt;
    protected virtual void OnChanged() {&lt;br /&gt;
        if (Changed != null)&lt;br /&gt;
            Changed();&lt;br /&gt;
        else&lt;br /&gt;
            Console.WriteLine(&amp;quot;Event fired. No handler!&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    public EventTestClass(int nValue) {&lt;br /&gt;
        SetValue(nValue);&lt;br /&gt;
    }&lt;br /&gt;
    public void SetValue(int nV) {&lt;br /&gt;
        if (nValue != nV) {&lt;br /&gt;
            nValue = nV;&lt;br /&gt;
            OnChanged();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
public class Mainclass {&lt;br /&gt;
    public void HandleChange1() {&lt;br /&gt;
        Console.WriteLine(&amp;quot;Handler 1 Called&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    public void HandleChange2() {&lt;br /&gt;
        Console.WriteLine(&amp;quot;Handler 2 Called&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    public Mainclass() {&lt;br /&gt;
    }&lt;br /&gt;
    public static void Main() {&lt;br /&gt;
        EventTestClass etc = new EventTestClass(3);&lt;br /&gt;
        Mainclass app = new Mainclass();&lt;br /&gt;
        etc.Changed += new EventTestClass.ValueChangedEventHandler(app.HandleChange1);&lt;br /&gt;
        etc.Changed += new EventTestClass.ValueChangedEventHandler(app.HandleChange2);&lt;br /&gt;
        etc.SetValue(5);&lt;br /&gt;
        etc.SetValue(5);&lt;br /&gt;
        etc.SetValue(3);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Create a custom means of managing the event invocation list==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
C#: The Complete Reference &lt;br /&gt;
by Herbert Schildt &lt;br /&gt;
Publisher: Osborne/McGraw-Hill (March 8, 2002)&lt;br /&gt;
ISBN: 0072134852&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
// Create a custom means of managing the event invocation list. &lt;br /&gt;
   &lt;br /&gt;
using System;  &lt;br /&gt;
  &lt;br /&gt;
// Declare a delegate for an event.   &lt;br /&gt;
delegate void MyEventHandler();  &lt;br /&gt;
  &lt;br /&gt;
// Declare an event class that holds up to 3 events. &lt;br /&gt;
class MyEvent {  &lt;br /&gt;
  MyEventHandler[] evnt = new MyEventHandler[3]; &lt;br /&gt;
 &lt;br /&gt;
  public event MyEventHandler SomeEvent { &lt;br /&gt;
    // Add an event to the list. &lt;br /&gt;
    add { &lt;br /&gt;
      int i; &lt;br /&gt;
 &lt;br /&gt;
      for(i=0; i &amp;lt; 3; i++) &lt;br /&gt;
        if(evnt[i] == null) { &lt;br /&gt;
          evnt[i] = value;  &lt;br /&gt;
          break; &lt;br /&gt;
        } &lt;br /&gt;
      if (i == 3) Console.WriteLine(&amp;quot;Event list full.&amp;quot;); &lt;br /&gt;
    } &lt;br /&gt;
 &lt;br /&gt;
    // Remove an event from the list. &lt;br /&gt;
    remove { &lt;br /&gt;
      int i; &lt;br /&gt;
 &lt;br /&gt;
      for(i=0; i &amp;lt; 3; i++) &lt;br /&gt;
        if(evnt[i] == value) { &lt;br /&gt;
          evnt[i] = null; &lt;br /&gt;
          break; &lt;br /&gt;
        } &lt;br /&gt;
      if (i == 3) Console.WriteLine(&amp;quot;Event handler not found.&amp;quot;); &lt;br /&gt;
    } &lt;br /&gt;
  }  &lt;br /&gt;
  &lt;br /&gt;
  // This is called to fire the events.  &lt;br /&gt;
  public void OnSomeEvent() {  &lt;br /&gt;
      for(int i=0; i &amp;lt; 3; i++) &lt;br /&gt;
        if(evnt[i] != null) evnt[i]();  &lt;br /&gt;
  }  &lt;br /&gt;
 &lt;br /&gt;
}  &lt;br /&gt;
  &lt;br /&gt;
// Create some classes that use MyEventHandler. &lt;br /&gt;
class W { &lt;br /&gt;
  public void Whandler() {  &lt;br /&gt;
    Console.WriteLine(&amp;quot;Event received by W object&amp;quot;);  &lt;br /&gt;
  }  &lt;br /&gt;
}  &lt;br /&gt;
  &lt;br /&gt;
class X { &lt;br /&gt;
  public void Xhandler() {  &lt;br /&gt;
    Console.WriteLine(&amp;quot;Event received by X object&amp;quot;);  &lt;br /&gt;
  }  &lt;br /&gt;
}  &lt;br /&gt;
  &lt;br /&gt;
class Y {  &lt;br /&gt;
  public void Yhandler() {  &lt;br /&gt;
    Console.WriteLine(&amp;quot;Event received by Y object&amp;quot;);  &lt;br /&gt;
  }  &lt;br /&gt;
}  &lt;br /&gt;
  &lt;br /&gt;
class Z {  &lt;br /&gt;
  public void Zhandler() {  &lt;br /&gt;
    Console.WriteLine(&amp;quot;Event received by Z object&amp;quot;);  &lt;br /&gt;
  }  &lt;br /&gt;
}  &lt;br /&gt;
  &lt;br /&gt;
public class EventDemo4 {  &lt;br /&gt;
  public static void Main() {   &lt;br /&gt;
    MyEvent evt = new MyEvent();  &lt;br /&gt;
    W wOb = new W();  &lt;br /&gt;
    X xOb = new X();  &lt;br /&gt;
    Y yOb = new Y();  &lt;br /&gt;
    Z zOb = new Z(); &lt;br /&gt;
 &lt;br /&gt;
    // Add handlers to the event list. &lt;br /&gt;
    Console.WriteLine(&amp;quot;Adding events.&amp;quot;); &lt;br /&gt;
    evt.SomeEvent += new MyEventHandler(wOb.Whandler);  &lt;br /&gt;
    evt.SomeEvent += new MyEventHandler(xOb.Xhandler);  &lt;br /&gt;
    evt.SomeEvent += new MyEventHandler(yOb.Yhandler);  &lt;br /&gt;
 &lt;br /&gt;
    // Can&amp;quot;t store this one -- full. &lt;br /&gt;
    evt.SomeEvent += new MyEventHandler(zOb.Zhandler);  &lt;br /&gt;
    Console.WriteLine(); &lt;br /&gt;
  &lt;br /&gt;
    // Fire the events.  &lt;br /&gt;
    evt.OnSomeEvent();  &lt;br /&gt;
    Console.WriteLine();  &lt;br /&gt;
  &lt;br /&gt;
    // Remove a handler. &lt;br /&gt;
    Console.WriteLine(&amp;quot;Remove xOb.Xhandler.&amp;quot;); &lt;br /&gt;
    evt.SomeEvent -= new MyEventHandler(xOb.Xhandler);  &lt;br /&gt;
    evt.OnSomeEvent();  &lt;br /&gt;
 &lt;br /&gt;
    Console.WriteLine(); &lt;br /&gt;
 &lt;br /&gt;
    // Try to remove it again. &lt;br /&gt;
    Console.WriteLine(&amp;quot;Try to remove xOb.Xhandler again.&amp;quot;); &lt;br /&gt;
    evt.SomeEvent -= new MyEventHandler(xOb.Xhandler);  &lt;br /&gt;
    evt.OnSomeEvent();  &lt;br /&gt;
 &lt;br /&gt;
    Console.WriteLine(); &lt;br /&gt;
 &lt;br /&gt;
    // Now, add Zhandler. &lt;br /&gt;
    Console.WriteLine(&amp;quot;Add zOb.Zhandler.&amp;quot;); &lt;br /&gt;
    evt.SomeEvent += new MyEventHandler(zOb.Zhandler); &lt;br /&gt;
    evt.OnSomeEvent();  &lt;br /&gt;
 &lt;br /&gt;
  }  &lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
           &lt;br /&gt;
       &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Delegate and event hierarchy==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
 * C# Programmers Pocket Consultant&lt;br /&gt;
 * Author: Gregory S. MacBeth&lt;br /&gt;
 * Email: gmacbeth@comporium.net&lt;br /&gt;
 * Create Date: June 27, 2003&lt;br /&gt;
 * Last Modified Date:&lt;br /&gt;
 */&lt;br /&gt;
using System;&lt;br /&gt;
namespace Client.Chapter_8___Delegates_and_Events&lt;br /&gt;
{&lt;br /&gt;
  public delegate int MyDelegateEventHandler(MyEventArgs e);&lt;br /&gt;
  &lt;br /&gt;
  public class MyEventSubscriber&lt;br /&gt;
  {&lt;br /&gt;
    static void Main(string[] args)&lt;br /&gt;
    {&lt;br /&gt;
      MyEventPublisher EventPublisher = new MyEventPublisher();&lt;br /&gt;
      MyEventArgs MyArgs = new MyEventArgs();&lt;br /&gt;
      MyArgs.MyString = &amp;quot;Hello World&amp;quot;;&lt;br /&gt;
      EventPublisher.MyEvent += new MyDelegateEventHandler(MyHandler);&lt;br /&gt;
      EventPublisher.DoSomething(MyArgs);&lt;br /&gt;
    }&lt;br /&gt;
    static int MyHandler(MyEventArgs e)&lt;br /&gt;
    {&lt;br /&gt;
      Console.WriteLine(e.MyString);&lt;br /&gt;
      return 0;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  public class MyEventArgs: EventArgs&lt;br /&gt;
  {&lt;br /&gt;
    public int MyInt;&lt;br /&gt;
    public long MyLong;&lt;br /&gt;
    public string MyString;&lt;br /&gt;
  }&lt;br /&gt;
  public class MyEventPublisher&lt;br /&gt;
  {&lt;br /&gt;
    public event MyDelegateEventHandler MyEvent;&lt;br /&gt;
    public int DoSomething(MyEventArgs e)&lt;br /&gt;
    {&lt;br /&gt;
      MyEvent(e);&lt;br /&gt;
      return 0;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
           &lt;br /&gt;
       &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Delegates And Events==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
Learning C# &lt;br /&gt;
by Jesse Liberty&lt;br /&gt;
Publisher: O&amp;quot;Reilly &lt;br /&gt;
ISBN: 0596003765&lt;br /&gt;
*/&lt;br /&gt;
 using System;&lt;br /&gt;
 namespace DelegatesAndEvents&lt;br /&gt;
 {&lt;br /&gt;
     public enum comparison&lt;br /&gt;
     {&lt;br /&gt;
         theFirstComesFirst = 1,&lt;br /&gt;
         theSecondComesFirst = 2&lt;br /&gt;
     }&lt;br /&gt;
     // A simple collection to hold two items&lt;br /&gt;
     class Pair&lt;br /&gt;
     {&lt;br /&gt;
         // Private array to hold the two objects&lt;br /&gt;
         private object[] thePair = new object[2];&lt;br /&gt;
         // The delegate declaration&lt;br /&gt;
         public delegate comparison&lt;br /&gt;
             WhichIsFirst(object obj1, object obj2);&lt;br /&gt;
         // Passed in constructor takes two objects,&lt;br /&gt;
         // added in order received&lt;br /&gt;
         public Pair(&lt;br /&gt;
             object firstObject,&lt;br /&gt;
             object secondObject)&lt;br /&gt;
         {&lt;br /&gt;
             thePair[0] = firstObject;&lt;br /&gt;
             thePair[1] = secondObject;&lt;br /&gt;
         }&lt;br /&gt;
         // Public method that orders the&lt;br /&gt;
         // two objects by whatever criteria the objects like!&lt;br /&gt;
         public void Sort(&lt;br /&gt;
             WhichIsFirst theDelegatedFunc)&lt;br /&gt;
         {&lt;br /&gt;
             if (theDelegatedFunc(thePair[0],thePair[1])&lt;br /&gt;
                 == comparison.theSecondComesFirst)&lt;br /&gt;
             {&lt;br /&gt;
                 object temp = thePair[0];&lt;br /&gt;
                 thePair[0] = thePair[1];&lt;br /&gt;
                 thePair[1] = temp;&lt;br /&gt;
             }&lt;br /&gt;
         }&lt;br /&gt;
         // Public method that orders the&lt;br /&gt;
         // two objects by the reverse of whatever criteria the&lt;br /&gt;
         // objects likes!&lt;br /&gt;
         public void ReverseSort(&lt;br /&gt;
             WhichIsFirst theDelegatedFunc)&lt;br /&gt;
         {&lt;br /&gt;
             if (theDelegatedFunc(thePair[0],thePair[1]) ==&lt;br /&gt;
                 comparison.theFirstComesFirst)&lt;br /&gt;
             {&lt;br /&gt;
                 object temp = thePair[0];&lt;br /&gt;
                 thePair[0] = thePair[1];&lt;br /&gt;
                 thePair[1] = temp;&lt;br /&gt;
             }&lt;br /&gt;
         }&lt;br /&gt;
         // Ask the two objects to give their string value&lt;br /&gt;
         public override string ToString()&lt;br /&gt;
         {&lt;br /&gt;
             return thePair[0].ToString() + &amp;quot;, &amp;quot;&lt;br /&gt;
                 + thePair[1].ToString();&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
     class Dog&lt;br /&gt;
     {&lt;br /&gt;
         private int weight;&lt;br /&gt;
         public Dog(int weight)&lt;br /&gt;
         {&lt;br /&gt;
             this.weight=weight;&lt;br /&gt;
         }&lt;br /&gt;
         // dogs are sorted by weight&lt;br /&gt;
         public static comparison WhichDogComesFirst(&lt;br /&gt;
             Object o1, Object o2)&lt;br /&gt;
         {&lt;br /&gt;
             Dog d1 = (Dog) o1;&lt;br /&gt;
             Dog d2 = (Dog) o2;&lt;br /&gt;
             return d1.weight &amp;gt; d2.weight ?&lt;br /&gt;
                 comparison.theSecondComesFirst :&lt;br /&gt;
                 comparison.theFirstComesFirst;&lt;br /&gt;
         }&lt;br /&gt;
         public override string ToString()&lt;br /&gt;
         {&lt;br /&gt;
             return weight.ToString();&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
     class Student&lt;br /&gt;
     {&lt;br /&gt;
         private string name;&lt;br /&gt;
         public Student(string name)&lt;br /&gt;
         {&lt;br /&gt;
             this.name = name;&lt;br /&gt;
         }&lt;br /&gt;
         // Students are sorted alphabetically&lt;br /&gt;
         public static comparison&lt;br /&gt;
             WhichStudentComesFirst(Object o1, Object o2)&lt;br /&gt;
         {&lt;br /&gt;
             Student s1 = (Student) o1;&lt;br /&gt;
             Student s2 = (Student) o2;&lt;br /&gt;
             return (String.rupare(s1.name, s2.name) &amp;lt; 0 ?&lt;br /&gt;
                 comparison.theFirstComesFirst :&lt;br /&gt;
                 comparison.theSecondComesFirst);&lt;br /&gt;
         }&lt;br /&gt;
         public override string ToString()&lt;br /&gt;
         {&lt;br /&gt;
             return name;&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
    public class TesterDelegatesAndEvents11&lt;br /&gt;
    {&lt;br /&gt;
       public void Run()&lt;br /&gt;
       {&lt;br /&gt;
           // Create two students and two dogs&lt;br /&gt;
           // and add them to Pair objects&lt;br /&gt;
           Student Jesse = new Student(&amp;quot;Jesse&amp;quot;);&lt;br /&gt;
           Student Stacey = new Student (&amp;quot;Stacey&amp;quot;);&lt;br /&gt;
           Dog Milo = new Dog(65);&lt;br /&gt;
           Dog Fred = new Dog(12);&lt;br /&gt;
           Pair studentPair = new Pair(Jesse,Stacey);&lt;br /&gt;
           Pair dogPair = new Pair(Milo, Fred);&lt;br /&gt;
           Console.WriteLine(&amp;quot;studentPair\t\t\t: {0}&amp;quot;,&lt;br /&gt;
               studentPair.ToString());&lt;br /&gt;
           Console.WriteLine(&amp;quot;dogPair\t\t\t\t: {0}&amp;quot;,&lt;br /&gt;
               dogPair.ToString());&lt;br /&gt;
           // Instantiate the delegates&lt;br /&gt;
           Pair.WhichIsFirst  theStudentDelegate =&lt;br /&gt;
               new Pair.WhichIsFirst(&lt;br /&gt;
               Student.WhichStudentComesFirst);&lt;br /&gt;
           Pair.WhichIsFirst theDogDelegate =&lt;br /&gt;
               new Pair.WhichIsFirst(&lt;br /&gt;
               Dog.WhichDogComesFirst);&lt;br /&gt;
           // Sort using the delegates&lt;br /&gt;
           studentPair.Sort(theStudentDelegate);&lt;br /&gt;
           Console.WriteLine(&amp;quot;After Sort studentPair\t\t: {0}&amp;quot;,&lt;br /&gt;
               studentPair.ToString());&lt;br /&gt;
           studentPair.ReverseSort(theStudentDelegate);&lt;br /&gt;
           Console.WriteLine(&amp;quot;After ReverseSort studentPair\t: {0}&amp;quot;,&lt;br /&gt;
               studentPair.ToString());&lt;br /&gt;
           dogPair.Sort(theDogDelegate);&lt;br /&gt;
           Console.WriteLine(&amp;quot;After Sort dogPair\t\t: {0}&amp;quot;,&lt;br /&gt;
               dogPair.ToString());&lt;br /&gt;
           dogPair.ReverseSort(theDogDelegate);&lt;br /&gt;
           Console.WriteLine(&amp;quot;After ReverseSort dogPair\t: {0}&amp;quot;,&lt;br /&gt;
               dogPair.ToString());&lt;br /&gt;
       }&lt;br /&gt;
       static void Main()&lt;br /&gt;
       {&lt;br /&gt;
          TesterDelegatesAndEvents11 t = new TesterDelegatesAndEvents11();&lt;br /&gt;
          t.Run();&lt;br /&gt;
       }&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
           &lt;br /&gt;
       &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Delegates And Events 2==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
Learning C# &lt;br /&gt;
by Jesse Liberty&lt;br /&gt;
Publisher: O&amp;quot;Reilly &lt;br /&gt;
ISBN: 0596003765&lt;br /&gt;
*/&lt;br /&gt;
 using System;&lt;br /&gt;
 namespace DelegatesAndEvents&lt;br /&gt;
 {&lt;br /&gt;
     public enum comparison&lt;br /&gt;
     {&lt;br /&gt;
         theFirstComesFirst = 1,&lt;br /&gt;
         theSecondComesFirst = 2&lt;br /&gt;
     }&lt;br /&gt;
     // A simple collection to hold two items.&lt;br /&gt;
     class Pair&lt;br /&gt;
     {&lt;br /&gt;
         // Private array to hold the two objects.&lt;br /&gt;
         private object[] thePair = new object[2];&lt;br /&gt;
         // The delegate declaration.&lt;br /&gt;
         public delegate comparison&lt;br /&gt;
             WhichIsFirst(object obj1, object obj2);&lt;br /&gt;
         // Passed in constructor takes two objects,&lt;br /&gt;
         // added in order received.&lt;br /&gt;
         public Pair(&lt;br /&gt;
             object firstObject,&lt;br /&gt;
             object secondObject)&lt;br /&gt;
         {&lt;br /&gt;
             thePair[0] = firstObject;&lt;br /&gt;
             thePair[1] = secondObject;&lt;br /&gt;
         }&lt;br /&gt;
         // Public method that orders&lt;br /&gt;
         // the two objects by whatever criteria the objects like!&lt;br /&gt;
         public void Sort(&lt;br /&gt;
             WhichIsFirst theDelegatedFunc)&lt;br /&gt;
         {&lt;br /&gt;
             if (theDelegatedFunc(thePair[0],thePair[1])&lt;br /&gt;
                 == comparison.theSecondComesFirst)&lt;br /&gt;
             {&lt;br /&gt;
                 object temp = thePair[0];&lt;br /&gt;
                 thePair[0] = thePair[1];&lt;br /&gt;
                 thePair[1] = temp;&lt;br /&gt;
             }&lt;br /&gt;
         }&lt;br /&gt;
         // Public method that orders&lt;br /&gt;
         // the two objects by the reverse of whatever criteria&lt;br /&gt;
         // the objects like!&lt;br /&gt;
         public void ReverseSort(&lt;br /&gt;
             WhichIsFirst theDelegatedFunc)&lt;br /&gt;
         {&lt;br /&gt;
             if (theDelegatedFunc(thePair[0],thePair[1]) ==&lt;br /&gt;
                 comparison.theFirstComesFirst)&lt;br /&gt;
             {&lt;br /&gt;
                 object temp = thePair[0];&lt;br /&gt;
                 thePair[0] = thePair[1];&lt;br /&gt;
                 thePair[1] = temp;&lt;br /&gt;
             }&lt;br /&gt;
         }&lt;br /&gt;
         // Ask the two objects to give their string value.&lt;br /&gt;
         public override string ToString()&lt;br /&gt;
         {&lt;br /&gt;
             return thePair[0].ToString() + &amp;quot;, &amp;quot;&lt;br /&gt;
                 + thePair[1].ToString();&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
     class Dog&lt;br /&gt;
     {&lt;br /&gt;
         private int weight;&lt;br /&gt;
         // A static delegate.&lt;br /&gt;
         public static readonly Pair.WhichIsFirst OrderDogs =&lt;br /&gt;
             new Pair.WhichIsFirst(Dog. WhichDogComesFirst);&lt;br /&gt;
         public Dog(int weight)&lt;br /&gt;
         {&lt;br /&gt;
             this.weight=weight;&lt;br /&gt;
         }&lt;br /&gt;
         // Dogs are sorted by weight.&lt;br /&gt;
         public static comparison WhichDogComesFirst(&lt;br /&gt;
             Object o1, Object o2)&lt;br /&gt;
         {&lt;br /&gt;
             Dog d1 = (Dog) o1;&lt;br /&gt;
             Dog d2 = (Dog) o2;&lt;br /&gt;
             return d1.weight &amp;gt; d2.weight ?&lt;br /&gt;
                 comparison.theSecondComesFirst :&lt;br /&gt;
                 comparison.theFirstComesFirst;&lt;br /&gt;
         }&lt;br /&gt;
         public override string ToString()&lt;br /&gt;
         {&lt;br /&gt;
             return weight.ToString();&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
     class Student&lt;br /&gt;
     {&lt;br /&gt;
         private string name;&lt;br /&gt;
         // A static delegate.&lt;br /&gt;
         public static readonly Pair.WhichIsFirst OrderStudents =&lt;br /&gt;
             new Pair.WhichIsFirst(Student.WhichStudentComesFirst);&lt;br /&gt;
         public Student(string name)&lt;br /&gt;
         {&lt;br /&gt;
             this.name = name;&lt;br /&gt;
         }&lt;br /&gt;
         // Students are sorted alphabetically.&lt;br /&gt;
         public static comparison&lt;br /&gt;
             WhichStudentComesFirst(Object o1, Object o2)&lt;br /&gt;
         {&lt;br /&gt;
             Student s1 = (Student) o1;&lt;br /&gt;
             Student s2 = (Student) o2;&lt;br /&gt;
             return (String.rupare(s1.name, s2.name) &amp;lt; 0 ?&lt;br /&gt;
                 comparison.theFirstComesFirst :&lt;br /&gt;
                 comparison.theSecondComesFirst);&lt;br /&gt;
         }&lt;br /&gt;
         public override string ToString()&lt;br /&gt;
         {&lt;br /&gt;
             return name;&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
    public class TesterDelegatesAndEvents1&lt;br /&gt;
    {&lt;br /&gt;
       public void Run()&lt;br /&gt;
       {&lt;br /&gt;
           // Create two students and two dogs&lt;br /&gt;
           // and add them to Pair objects.&lt;br /&gt;
           Student Jesse = new Student(&amp;quot;Jesse&amp;quot;);&lt;br /&gt;
           Student Stacey = new Student (&amp;quot;Stacey&amp;quot;);&lt;br /&gt;
           Dog Milo = new Dog(65);&lt;br /&gt;
           Dog Fred = new Dog(12);&lt;br /&gt;
           // Create the Pair object.&lt;br /&gt;
           Pair studentPair = new Pair(Jesse,Stacey);&lt;br /&gt;
           Pair dogPair = new Pair(Milo, Fred);&lt;br /&gt;
           Console.WriteLine(&amp;quot;studentPair\t\t\t: {0}&amp;quot;,&lt;br /&gt;
               studentPair.ToString());&lt;br /&gt;
           Console.WriteLine(&amp;quot;dogPair\t\t\t\t: {0}&amp;quot;,&lt;br /&gt;
               dogPair.ToString());&lt;br /&gt;
           // Tell the student Pair to sort itself,&lt;br /&gt;
           // passing in the Student delegate.&lt;br /&gt;
           studentPair.Sort(Student.OrderStudents);&lt;br /&gt;
           Console.WriteLine(&amp;quot;After Sort studentPair\t\t: {0}&amp;quot;,&lt;br /&gt;
               studentPair.ToString());&lt;br /&gt;
           studentPair.ReverseSort(Student.OrderStudents);&lt;br /&gt;
           Console.WriteLine(&amp;quot;After ReverseSort studentPair\t: {0}&amp;quot;,&lt;br /&gt;
               studentPair.ToString());&lt;br /&gt;
           // Tell the Dog pair to sort itself,&lt;br /&gt;
           // passing in the Dog delegate.&lt;br /&gt;
           dogPair.Sort(Dog.OrderDogs);&lt;br /&gt;
           Console.WriteLine(&amp;quot;After Sort dogPair\t\t: {0}&amp;quot;,&lt;br /&gt;
               dogPair.ToString());&lt;br /&gt;
           dogPair.ReverseSort(Dog.OrderDogs);&lt;br /&gt;
           Console.WriteLine(&amp;quot;After ReverseSort dogPair\t: {0}&amp;quot;,&lt;br /&gt;
               dogPair.ToString());&lt;br /&gt;
       }&lt;br /&gt;
       [STAThread]&lt;br /&gt;
       static void Main()&lt;br /&gt;
       {&lt;br /&gt;
          TesterDelegatesAndEvents1 t = new TesterDelegatesAndEvents1();&lt;br /&gt;
          t.Run();&lt;br /&gt;
       }&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
           &lt;br /&gt;
       &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Events:Add and Remove Functions==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
using System;&lt;br /&gt;
public class AddandRemoveFunctions {&lt;br /&gt;
    static public void ButtonHandler(object sender, EventArgs e)&lt;br /&gt;
    {&lt;br /&gt;
        Console.WriteLine(&amp;quot;Button clicked&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static void Main()&lt;br /&gt;
    {&lt;br /&gt;
        Button button = new Button();&lt;br /&gt;
        &lt;br /&gt;
        button.AddClick(new Button.ClickHandler(ButtonHandler));&lt;br /&gt;
        &lt;br /&gt;
        button.SimulateClick();&lt;br /&gt;
        &lt;br /&gt;
        button.RemoveClick(new Button.ClickHandler(ButtonHandler));&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
public class Button&lt;br /&gt;
{&lt;br /&gt;
    public delegate void ClickHandler(object sender, EventArgs e);&lt;br /&gt;
    private ClickHandler click;&lt;br /&gt;
    &lt;br /&gt;
    public void AddClick(ClickHandler clickHandler)&lt;br /&gt;
    {&lt;br /&gt;
        click += clickHandler;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public void RemoveClick(ClickHandler clickHandler)&lt;br /&gt;
    {&lt;br /&gt;
        click -= clickHandler;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    protected void OnClick()&lt;br /&gt;
    {&lt;br /&gt;
        if (click != null)&lt;br /&gt;
        click(this, null);&lt;br /&gt;
        &lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public void SimulateClick()&lt;br /&gt;
    {&lt;br /&gt;
        OnClick();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
           &lt;br /&gt;
       &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Events:Add and Remove Functions 2==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
using System;&lt;br /&gt;
public class AddandRemoveFunctions2&lt;br /&gt;
{&lt;br /&gt;
    static public void ButtonHandler(object sender, EventArgs e)&lt;br /&gt;
    {&lt;br /&gt;
        Console.WriteLine(&amp;quot;Button clicked&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static void Main()&lt;br /&gt;
    {&lt;br /&gt;
        Button button = new Button();&lt;br /&gt;
        &lt;br /&gt;
        button.Click += new Button.ClickHandler(ButtonHandler);&lt;br /&gt;
        &lt;br /&gt;
        button.SimulateClick();&lt;br /&gt;
        &lt;br /&gt;
        button.Click -= new Button.ClickHandler(ButtonHandler);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
public class Button&lt;br /&gt;
{&lt;br /&gt;
    public delegate void ClickHandler(object sender, EventArgs e);&lt;br /&gt;
    &lt;br /&gt;
    public event ClickHandler Click;&lt;br /&gt;
    &lt;br /&gt;
    protected void OnClick()&lt;br /&gt;
    {&lt;br /&gt;
        if (Click != null)&lt;br /&gt;
        Click(this, null);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public void SimulateClick()&lt;br /&gt;
    {&lt;br /&gt;
        OnClick();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
           &lt;br /&gt;
       &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Events: Custom Add and Remove==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
A Programmer&amp;quot;s Introduction to C# (Second Edition)&lt;br /&gt;
by Eric Gunnerson&lt;br /&gt;
Publisher: Apress  L.P.&lt;br /&gt;
ISBN: 1-893115-62-3&lt;br /&gt;
*/&lt;br /&gt;
// 23 - Events\Custom Add and Remove&lt;br /&gt;
// copyright 2000 Eric Gunnerson&lt;br /&gt;
using System;&lt;br /&gt;
using System.Collections;&lt;br /&gt;
using System.Runtime.rupilerServices;&lt;br /&gt;
&lt;br /&gt;
public class EventsCustomAddandRemove&lt;br /&gt;
{&lt;br /&gt;
    static public void ButtonHandler(object sender, EventArgs e)&lt;br /&gt;
    {&lt;br /&gt;
        Console.WriteLine(&amp;quot;Button clicked&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static void Main()&lt;br /&gt;
    {&lt;br /&gt;
        Button button = new Button();&lt;br /&gt;
        &lt;br /&gt;
        button.Click += new Button.ClickHandler(ButtonHandler);&lt;br /&gt;
        &lt;br /&gt;
        button.SimulateClick();&lt;br /&gt;
        &lt;br /&gt;
        button.Click -= new Button.ClickHandler(ButtonHandler);&lt;br /&gt;
        &lt;br /&gt;
        button.TearDown();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//&lt;br /&gt;
// Global delegate cache. Uses a two-level hashtable. The delegateStore hashtable &lt;br /&gt;
// stores a hashtable keyed on the object instance, and the instance hashtable is &lt;br /&gt;
// keyed on the unique key. This allows fast tear-down of the object when it&amp;quot;s destroyed.&lt;br /&gt;
//&lt;br /&gt;
public class DelegateCache&lt;br /&gt;
{&lt;br /&gt;
    private DelegateCache() {}    // nobody can create one of these&lt;br /&gt;
    &lt;br /&gt;
    Hashtable delegateStore = new Hashtable();    // top level hash table&lt;br /&gt;
    &lt;br /&gt;
    static DelegateCache dc = new DelegateCache();    // our single instance&lt;br /&gt;
    &lt;br /&gt;
    Hashtable GetInstanceHash(object instance)&lt;br /&gt;
    {&lt;br /&gt;
        Hashtable instanceHash = (Hashtable) delegateStore[instance];&lt;br /&gt;
        &lt;br /&gt;
        if (instanceHash == null)&lt;br /&gt;
        {&lt;br /&gt;
            instanceHash = new Hashtable();&lt;br /&gt;
            delegateStore[instance] = instanceHash;&lt;br /&gt;
            &lt;br /&gt;
        }&lt;br /&gt;
        return(instanceHash);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static void Combine(Delegate myDelegate, object instance, object key)&lt;br /&gt;
    {&lt;br /&gt;
        lock(instance)&lt;br /&gt;
        {&lt;br /&gt;
            Hashtable instanceHash = dc.GetInstanceHash(instance);        &lt;br /&gt;
            &lt;br /&gt;
            instanceHash[key] = Delegate.rubine((Delegate) instanceHash[key],&lt;br /&gt;
            myDelegate);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static void Remove(Delegate myDelegate, object instance, object key)&lt;br /&gt;
    {&lt;br /&gt;
        lock(instance)&lt;br /&gt;
        {&lt;br /&gt;
            Hashtable instanceHash = dc.GetInstanceHash(instance);        &lt;br /&gt;
            &lt;br /&gt;
            instanceHash[key] = Delegate.Remove((Delegate) instanceHash[key],&lt;br /&gt;
            myDelegate);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static Delegate Fetch(object instance, object key)&lt;br /&gt;
    {&lt;br /&gt;
        Hashtable instanceHash = dc.GetInstanceHash(instance);        &lt;br /&gt;
        &lt;br /&gt;
        return((Delegate) instanceHash[key]);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static void ClearDelegates(object instance)&lt;br /&gt;
    {&lt;br /&gt;
        dc.delegateStore.Remove(instance);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
public class Button&lt;br /&gt;
{&lt;br /&gt;
    public void TearDown()&lt;br /&gt;
    {&lt;br /&gt;
        DelegateCache.ClearDelegates(this);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    public delegate void ClickHandler(object sender, EventArgs e);&lt;br /&gt;
    &lt;br /&gt;
    static object clickEventKey = new object();&lt;br /&gt;
    &lt;br /&gt;
    public event ClickHandler Click&lt;br /&gt;
    {&lt;br /&gt;
        add&lt;br /&gt;
        {&lt;br /&gt;
            DelegateCache.rubine(value, this, clickEventKey);&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        remove&lt;br /&gt;
        {&lt;br /&gt;
            DelegateCache.Remove(value, this, clickEventKey);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    protected void OnClick()&lt;br /&gt;
    {&lt;br /&gt;
        ClickHandler ch = (ClickHandler) DelegateCache.Fetch(this, clickEventKey);&lt;br /&gt;
        &lt;br /&gt;
        if (ch != null)&lt;br /&gt;
        ch(this, null);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public void SimulateClick()&lt;br /&gt;
    {&lt;br /&gt;
        OnClick();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
           &lt;br /&gt;
       &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Individual objects receive notifications when instance     event handlers are used==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
C#: The Complete Reference &lt;br /&gt;
by Herbert Schildt &lt;br /&gt;
Publisher: Osborne/McGraw-Hill (March 8, 2002)&lt;br /&gt;
ISBN: 0072134852&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
/* Individual objects receive notifications when instance &lt;br /&gt;
   event handlers are used. */ &lt;br /&gt;
  &lt;br /&gt;
using System; &lt;br /&gt;
 &lt;br /&gt;
// Declare a delegate for an event.  &lt;br /&gt;
delegate void MyEventHandler(); &lt;br /&gt;
 &lt;br /&gt;
// Declare an event class. &lt;br /&gt;
class MyEvent { &lt;br /&gt;
  public event MyEventHandler SomeEvent; &lt;br /&gt;
 &lt;br /&gt;
  // This is called to fire the event. &lt;br /&gt;
  public void OnSomeEvent() { &lt;br /&gt;
    if(SomeEvent != null) &lt;br /&gt;
      SomeEvent(); &lt;br /&gt;
  } &lt;br /&gt;
} &lt;br /&gt;
 &lt;br /&gt;
class X { &lt;br /&gt;
  int id; &lt;br /&gt;
 &lt;br /&gt;
  public X(int x) { id = x; } &lt;br /&gt;
 &lt;br /&gt;
  // This is an instance method that will be used as an event handler. &lt;br /&gt;
  public void Xhandler() { &lt;br /&gt;
    Console.WriteLine(&amp;quot;Event received by object &amp;quot; + id); &lt;br /&gt;
  } &lt;br /&gt;
} &lt;br /&gt;
 &lt;br /&gt;
public class EventDemo2 { &lt;br /&gt;
  public static void Main() {  &lt;br /&gt;
    MyEvent evt = new MyEvent(); &lt;br /&gt;
    X o1 = new X(1); &lt;br /&gt;
    X o2 = new X(2); &lt;br /&gt;
    X o3 = new X(3); &lt;br /&gt;
 &lt;br /&gt;
    evt.SomeEvent += new MyEventHandler(o1.Xhandler); &lt;br /&gt;
    evt.SomeEvent += new MyEventHandler(o2.Xhandler); &lt;br /&gt;
    evt.SomeEvent += new MyEventHandler(o3.Xhandler); &lt;br /&gt;
 &lt;br /&gt;
    // Fire the event. &lt;br /&gt;
    evt.OnSomeEvent(); &lt;br /&gt;
  } &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
           &lt;br /&gt;
       &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Use delegate: event==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
 * C# Programmers Pocket Consultant&lt;br /&gt;
 * Author: Gregory S. MacBeth&lt;br /&gt;
 * Email: gmacbeth@comporium.net&lt;br /&gt;
 * Create Date: June 27, 2003&lt;br /&gt;
 * Last Modified Date:&lt;br /&gt;
 */&lt;br /&gt;
using System;&lt;br /&gt;
namespace Client.Chapter_8___Delegates_and_Events&lt;br /&gt;
{&lt;br /&gt;
  public delegate void MyDelegateEventHandler(int i);&lt;br /&gt;
  &lt;br /&gt;
  public class MyEventSubscriberChapter_8___Delegates_and_Events&lt;br /&gt;
  {&lt;br /&gt;
    static void Main(string[] args)&lt;br /&gt;
    {&lt;br /&gt;
      MyEventPublisher EventPublisher = new MyEventPublisher();&lt;br /&gt;
      &lt;br /&gt;
      MyDelegateEventHandler MyAnonymousDelegate = delegate(int x)&lt;br /&gt;
      {&lt;br /&gt;
        Console.WriteLine(&amp;quot;Anonymous Event FIRED!&amp;quot;);&lt;br /&gt;
      };&lt;br /&gt;
      EventPublisher.MyEvent += MyAnonymousDelegate;&lt;br /&gt;
      &lt;br /&gt;
      EventPublisher.DoSomething();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  public class MyEventPublisher&lt;br /&gt;
  {&lt;br /&gt;
    public event MyDelegateEventHandler MyEvent;&lt;br /&gt;
    public int DoSomething()&lt;br /&gt;
    {&lt;br /&gt;
      MyEvent(5);&lt;br /&gt;
      return 0;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
           &lt;br /&gt;
       &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Use the bult-in EventHandler delegate==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
C#: The Complete Reference &lt;br /&gt;
by Herbert Schildt &lt;br /&gt;
Publisher: Osborne/McGraw-Hill (March 8, 2002)&lt;br /&gt;
ISBN: 0072134852&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
// Use the bult-in EventHandler delegate. &lt;br /&gt;
  &lt;br /&gt;
using System; &lt;br /&gt;
 &lt;br /&gt;
// Declare an event class. &lt;br /&gt;
class MyEvent { &lt;br /&gt;
  public event EventHandler SomeEvent; // uses EventHandler delegate &lt;br /&gt;
 &lt;br /&gt;
  // This is called to fire SomeEvent. &lt;br /&gt;
  public void OnSomeEvent() { &lt;br /&gt;
    if(SomeEvent != null) &lt;br /&gt;
      SomeEvent(this, EventArgs.Empty); &lt;br /&gt;
  } &lt;br /&gt;
} &lt;br /&gt;
 &lt;br /&gt;
public class EventDemo6 { &lt;br /&gt;
  static void handler(object source, EventArgs arg) { &lt;br /&gt;
    Console.WriteLine(&amp;quot;Event occurred&amp;quot;); &lt;br /&gt;
    Console.WriteLine(&amp;quot;Source is &amp;quot; + source); &lt;br /&gt;
  } &lt;br /&gt;
 &lt;br /&gt;
  public static void Main() {  &lt;br /&gt;
    MyEvent evt = new MyEvent(); &lt;br /&gt;
 &lt;br /&gt;
    // Add handler() to the event list. &lt;br /&gt;
    evt.SomeEvent += new EventHandler(handler); &lt;br /&gt;
 &lt;br /&gt;
    // Fire the event. &lt;br /&gt;
    evt.OnSomeEvent(); &lt;br /&gt;
  } &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
           &lt;br /&gt;
       &amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	</feed>