using  System;  
class  DChatServer  {  
           public  delegate  void  OnMsgArrived(String  message);  
           private  static  OnMsgArrived  onMsgArrived;  
           private  DChatServer()  {}  
 
           public  static  void  ClientConnect(OnMsgArrived  onMsgArrived)  {  
               DChatServer.onMsgArrived  =  (OnMsgArrived)  
                       Delegate.Combine(DChatServer.onMsgArrived,  onMsgArrived);  
       }  
 
         public  static  void  ClientDisconnect(OnMsgArrived  onMsgArrived)  {  
               DChatServer.onMsgArrived  =  (OnMsgArrived)  
                       Delegate.Remove(DChatServer.onMsgArrived,  onMsgArrived);  
       }  
 
       public  static  void  SendMsg(String  msg)  {  
                         SendMsg(msg,  null);  
       }  
 
       public  static  void  SendMsg(String  msg,  Object  excludeClient)  {  
               if  (excludeClient  ==  null)  {  
                                 onMsgArrived(msg);  
///////////////////////////////////////////////////////////////////////////////////  
//疑问:为什么在程序运行到此处时直接调用了      private  void  onMsgArrived(String  msg)此事件?((OnMsgArrived)  DelegateList[i])(msg);同样效果。难道public  delegate  void  OnMsgArrived(String  message);定义的代理指向该方法吗?可是他们不再同一个类里?此例子出处为,Microsoft  Visual  Studio  .NET  2003\SDK\v1.1\Samples\Technologies\DelegatesAndEvents  
//////////////////////////////////////////////////////////  
                 
                   }  else  {  
                       Delegate[]  DelegateList  =  onMsgArrived.GetInvocationList();  
                       for  (int  i  =  0;  i  <  DelegateList.Length;  i++)  {  
                               if  (DelegateList[i].Target  !=  excludeClient)  {  
                                                           ((OnMsgArrived)  DelegateList[i])(msg);  
                               }  
                       }                          
               }                  
       }          
}  
 
 
///////////////////////////////////////////////////////////////////////////////  
 
 
class  DChatClient  {  
             
       private  void  onMsgArrived(String  msg)  {  
                         
               Console.WriteLine("Msg  arrived  (Client  {0}):  {1}",  clientName,  msg);  
       }  
 
       private  String  clientName;  
 
       public  DChatClient(String  clientName)  {  
               this.clientName  =  clientName;  
               DChatServer.ClientConnect(new  DChatServer.OnMsgArrived(onMsgArrived));  
       }  
 
       public  void  Dispose()  {  
               DChatServer.ClientDisconnect(new  DChatServer.OnMsgArrived(onMsgArrived));  
               GC.SuppressFinalize(this);  
       }  
 
       ~DChatClient()  {  
               Dispose();                  
       }  
}  
 
///////////////////////////////////////////////////////////////////////////////  
 
 
class  Application  {  
       private  static  void  DelegateChatServerDemo()  {  
               Console.WriteLine("Demo  start:  Delegate  Chat  Server.");  
 
               DChatClient  cc1  =  new  DChatClient("1");  
               DChatClient  cc2  =  new  DChatClient("2");  
               DChatClient  cc3  =  new  DChatClient("3");  
 
               DChatServer.SendMsg("Hi  to  all  clients");  
               DChatServer.SendMsg("Hi  to  all  clients  except  client  2",  cc2);  
 
               cc1.Dispose();  
               cc2.Dispose();  
               cc3.Dispose();  
               Console.WriteLine("Demo  stop:  Delegate  Chat  Server.");  
       }  
 
         public  static  void  Main()  {  
               DelegateChatServerDemo();  
               Console.ReadLine();  
       }  
}