using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication1
{
    
class Program
    {
        
public delegate void del(object obj, CallMeEventArgs e); //声明委托
        public event del shout;//声明事件

        
public void send(object obj, CallMeEventArgs e)   //方法1,参数写声明委托的一致.
        {
            Console.WriteLine(
"好," + e.name);  //输出传递的事件参数的值
        }

        
public void send2(object obj, CallMeEventArgs e)  //方法2,参数写声明委托的一致.
        {
            Console.WriteLine(
"好呀! " + e.name);  //输出传递的事件参数的值
        }

        
//声明事件
        public void CallMe(string s)
        {
            CallMeEventArgs e 
= new CallMeEventArgs(s);  //传递e参数的值
            OnCallMe(e);  //调用触发事件代码
        }

        
//触发事件
        protected void OnCallMe(CallMeEventArgs e)
        {
            Console.WriteLine(e.name 
+ "来了!");
            
if (shout != null)   //如果事件中有注册的委托
            {
                shout(
this, e);   //事件的参数应和委托一样
            }
        }

        
//自定义事件参数类型,传递Name值.
        public class CallMeEventArgs : EventArgs
        {
            
public string name;
            
public CallMeEventArgs(string name)
            {
                
this.name = name;
            }

        }

        
static void Main(string[] args)
        {
            Program p 
= new Program();   //实例化Program的一个实例
            p.shout += new Program.del(p.send); //将send方法实例到委托并登记到事件中
            p.shout += new Program.del(p.send2);//将send2方法实例到委托并登记到事件中
            p.CallMe("小小");   //调用事件
            Console.ReadLine();
        }
    }
}