小弟刚学委托,大概了解其用法,有一些地方还是理解不透彻,比如public delegate void BoiledEventHandler(Object sender, BoiledEventArgs e);
public class BoiledEventArgs : EventArgs
        {
            public readonly int temperature;
            public BoiledEventArgs(int temperature)
            {
                this.temperature = temperature;
            }
        }
这里的BoiledEventArgs 类在这里就不是很理解

解决方案 »

  1.   

    BoiledEventArgs类不理解是什么意思?BoiledEventArgs继承于EventArgs类。然后定义了一个字段,一个构造方法。然后呢
      

  2.   

    看字面意思就能看出来了吧EventArgs 事件参数。
    如果你的委托不需要参数,则这个累就是多余的。即使有参数,你也可以不用继承这个类,继承它只是为了更规范的写法。
      

  3.   

    看字面意思就能看出来了吧EventArgs 事件参数。
    如果你的委托不需要参数,则这个累就是多余的。即使有参数,你也可以不用继承这个类,继承它只是为了更规范的写法。
    如果两个窗口传值,是不是通过这种类的继承后,可以接收消息
      

  4.   

    只是一个封装了委托描述的实体类这样来理解。 继不继承EventArgs代码内目测没有区别,无需为它纠结。
      

  5.   

    看字面意思就能看出来了吧EventArgs 事件参数。
    如果你的委托不需要参数,则这个累就是多余的。即使有参数,你也可以不用继承这个类,继承它只是为了更规范的写法。
    如果两个窗口传值,是不是通过这种类的继承后,可以接收消息可以这样做,但是你这样理解有些不妥。
    这么说吧,你看委托的定义public delegate void BoiledEventHandler(Object sender, BoiledEventArgs e);
    和方法签名的定义只差一个delegate关键字。
    在C#中,方法是不能作为参数传递的,对吧。委托的作用就是对一个方法进行“代理”,让其可以通过参数来传递。方法是什么,是一个功能块,一段处理逻辑,能把它当作参数来传递就意味着这段处理逻辑可以重用,可以被替换,是一种很强的抽象能力,只是c#不支持把方法当作参数,所以才有了委托这个包装类型来包装方法。
      

  6.   

    把委托看成对方法的包装,那么,这个方法可以有参数,也可以无参数,所以你的疑问应该不是什么疑问了吧。Object sender, EventArgs e这种东西是一般事件里面常见的,因为事件处理程序需要知道当前触发事件是谁(sender),传递了什么参数e,如果你的事件不需要知道这些信息,那么这两个参数就可以去掉。
      

  7.   

    建议楼主看看设计模式的委托模式。从某种角度讲,c#中的委托,可以看做是委托模式的一种简化实现。http://www.blueidea.com/tech/program/2007/4959_5.asp
      

  8.   

    你问的叫事件参数,这还涉及到委托,事件的概念,而你说的那个是事件的参数,从这个单一的玩意来说,讲不出因为所以. 我一开始也非常非常迷惑 , 书中会用妈的好多奇耙的新名词来做一个输出hell world字串的列子.我想,卧CAO,
    为什么不直接打印出来Hell world.为嘛要用事件委托绕这么大个弯. 这就是事件委托的2B之处,封装,只留下所谓的处理接口,把肠子的功能放在肚子封装好,只留个吃东西的嘴在外面.
    假如你就是那肚子public class Stomach;   
     public class Stomach {       
       //1 ,你委托嘴来吃东西 
           protected delegate void Mouth(object sender, System.EventArgs e);
       //2
       //还要定义个"吃"的事件(就是说,当有"吃"的事件时,才能吃,不是说有了嘴就可以吃了    
            protected event Mouth EatEvent;
            //3
          // 还要定义个事件激发器, 由它来发生吃的事件.想吃并是不那么容易
     //这就是微软泥玛的SB封装,接口,一大串长长的奇怪英文名字,拐弯抹角,让我们做着与编程不相干的工作.
    //所以它们现在开始喜欢jQuery了
            public void  RaiseEetEvent()
            {
               //这里就是那吃的事件参数,就是你问的主题,注意吃的事件是主要的,你问的那个事件参数
                 // 只是个副作用,比如,包括了今天要吃牛肉,还是包子,之类的信息
                System.EventArgs e = new System.EventArgs();
                if (EatEvent != null) EatEvent(this, e);
            }
        }
    你就是那肚子,你把消化的主要工作都做了,只留个嘴在外面,吃东西.
    所以,如果我是身体,我要用你 ,我就不用再考虑你是怎么消化掉它们,那么我只要继承你,处理嘴巴的工作就可以了 
    public class Body: Stomach
    {      
      // 1 然后,添加一个吃的事件,并委托 我的嘴来吃
       public Body(){   EatEvent += new Mouth(MyMouth); }
       void MyMouth(object sender, System.EventArgs e){
         // 别忘了, 你是肚子,你留了个嘴巴在外面,我是身体,我现在继承,我可以在这吃我想吃的东西
         
      }
    }
    上面的都是准备工作,真正的工作下面才开始.微软就喜欢搞复杂,把你搞糊涂.
    最后最后正式的工作开始了,有三个主角 一个是你stomach 另一个是我body 还有一个就是 事件发生器
    static void main()
    {
          Body  me= new Body();
             me.RaiseEatEvent();
    //调用事件发生器,产生了一个事件的事件. 然后就按上面的分工开始工作  
    }