class Man
    {
        private string name;
        public Man(string name)
        {
            this.name = name; 
        }
        public void eat(string food)
        {
            Console.WriteLine(name+"吃"+food);
            
        
        }
    }    delegate void EatDelegate(string food);//声明代理    class Program
    {        static void EatTogether(string food, params EatDelegate[] values)
        {
            if (values == null)
            {
                Console.WriteLine("没有东西吃了!");            }
            else
            {
                EatDelegate EatList = null;
                foreach (EatDelegate ed in values)
                {
                    EatList += ed;
                    EatList(food);                }            }        }
       
       static void Main(string[] args)
        {
           
            Man ZS = new Man("张三");
            Man LS = new Man("李四");
            EatDelegate zs = new EatDelegate(ZS.eat);
            EatDelegate ls = new EatDelegate(LS.eat);
            EatTogether("西瓜",zs,ls);
            //Console.ReadLine();
        }
    }  张三吃西瓜怎么会出现再次?

解决方案 »

  1.   

    问题在这里:EatDelegate EatList = null;
    foreach (EatDelegate ed in values)
    {
       EatList += ed;
       EatList(food);
    }
    -》
    1、EatDelegate EatList = null;
    foreach (EatDelegate ed in values)
    {
       EatList += ed;   
    }
    foreach (EatDelegate ed in values)
    {
       EatList(food);   
    }
    2、foreach (EatDelegate ed in values)
    {
       ed(food);   
    }
    多调试下看看就会找到原因。
      

  2.   

    Sorry: 有点小错,改成下面这2个都可以。1、EatDelegate EatList = null;
    foreach (EatDelegate ed in values)
    {
       EatList += ed;   
    }
    EatList(food);   
    2、foreach (EatDelegate ed in values)
    {
       ed(food);   
    }
      

  3.   

    "使用委托可以将多个方法绑定到同一个委托变量,当调用此变量时可以依次调用所有绑定的方法"foreach (EatDelegate ed in values) 

        EatList += ed; 
        EatList(food); 

    第1次调用EatList(food);输出“张三...”,
    第2次调用EatList(food);输出“张三...”、“李四...”
      

  4.   

                                            EatList   +=   ed; 
    注意这里有个加号。Delegate支持multicast,你加上的越多,触发的时候都会执行次数增加。
      

  5.   

    LZ点这个
    http://www.google.cn/search?client=aff-cs-maxthon&forid=1&ie=utf-8&oe=UTF-8&hl=zh-CN&q=%E5%A4%9A%E6%92%AD%E5%A7%94%E6%89%98
      

  6.   

    结贴
    我这样写也只执行一次
     Man   ZS   =   new   Man("张三"); 
     Man   LS   =   new   Man("李四"); 
     EatDelegate   zs   =   new   EatDelegate(ZS.eat); 
     zs=zs+LS.eat
     EatTogether("西瓜",zs); 
    //
    谢谢各位