GUI Windows Forms C# Tutorial

using System;
using System.Collections;
using System.Runtime.CompilerServices;
public class Button
{
    public delegate void ClickHandler(object sender, EventArgs e);
    
    Hashtable delegateStore = new Hashtable();
    static object clickEventKey = new object();
    
    public event ClickHandler Click
    {
        [MethodImpl(MethodImplOptions.Synchronized)]
        add
        {
            delegateStore[clickEventKey] =
            Delegate.Combine((Delegate) delegateStore[clickEventKey],
            value);
        }
        
        [MethodImpl(MethodImplOptions.Synchronized)]
        remove
        {
            delegateStore[clickEventKey] =
            Delegate.Remove((Delegate) delegateStore[clickEventKey],
            value);
        }
    }
    
    protected void OnClick()
    {
        ClickHandler ch = (ClickHandler) delegateStore[clickEventKey];
        if (ch != null)
        ch(this, null);
    }
    
    public void DoClick()
    {
        OnClick();
    }
}
class MainClass
{
    static public void ButtonHandler(object sender, EventArgs e)
    {
        Console.WriteLine("Button clicked");
    }
    
    public static void Main()
    {
        Button button = new Button();
        
        button.Click += new Button.ClickHandler(ButtonHandler);
        
        button.DoClick();
        
        button.Click -= new Button.ClickHandler(ButtonHandler);
        
        button.DoClick();
    }
}
Button clicked