public class Sender
        {
            public delegate void EventHandler(object sender);
            public event EventHandler Event;            public void TriggerEvent()
            {
                Console.WriteLine("Trigger an event.");
                Event(this);
            }
        }        public class Receiver
        {
            public Receiver(Sender sender)
            {
                sender.Event += new Sender.EventHandler(OnEvent);
            }
            private void OnEvent(object sender)
            {
                Console.WriteLine("Received and handled an event.");
                Console.Read();
            }
        } 看到一个例子,不知道如何试验结果控制台程序 main()
 如何把这两个类关联起来? 谢谢

解决方案 »

  1.   


    Sender sender  = new Senser();
    Receiver receiver = new Receiver(sender);
    sender.TriggerEvent();
      

  2.   

    sender发生一定变化后会通过事件方式通知receiver产生响应。
      

  3.   

    可以用接口代替,如果要用event关键字声明的事件就必须要用委托
      

  4.   


    什么情况下,可以考虑接口?例如委托 事件
    我 和 A,B我委托 A ,观察B,,如果B家开始冒烟,让A通知我,可以去B家蹭饭了B家 烟囱冒烟,可以理解为事件
    我对A 可以理解为委托
    如果用接口的话,怎么理解?
      

  5.   


    什么情况下,可以考虑接口?例如委托 事件
    我 和 A,B我委托 A ,观察B,,如果B家开始冒烟,让A通知我,可以去B家蹭饭了B家 烟囱冒烟,可以理解为事件
    我对A 可以理解为委托
    如果用接口的话,怎么理解?http://www.google.com.hk/#newwindow=1&q=observer+pattern&safe=strict
      

  6.   

    你委托A,观察B,如果B家开始冒烟,让A通知你去B家蹭饭。
    如果是接口,以后别人效仿你(类)的做法(继承)时,必须实现A通知自己的接口(可以理解为约束)
      

  7.   

    http://www.cnblogs.com/xuting/archive/2008/08/26/1276318.html推荐
      

  8.   

    事件本质上是委托,其实自己用的时候很少,在windows窗体程序中,编写事件的方法时自动通过委托将事件与指定的方法进行委托
      

  9.   

    看到一个混硬件版块的牛人,跑到net版本来不耻下问,感觉真他妈爽
      

  10.   

    事件即委托,是用来减少依赖的。 一个类的方法如何让别人调用,可以new、可以用静态,还可以把 这个方法传递出去,跟传递一个参数一样。
      

  11.   

    至于什么情况下是什么事件可以用委托代替,委托不一定能用事件代替常规情况下:“必须依靠外面才能确定方法,使用委托;而不需要外面的方法,甚至是从class内部发出滴通知外面接收的东西,使用事件”大体上是这样
    1.我委托你办事,这事我办不好,必须委托你来办--这是委托
    2.我已经办好,需要通知你来接收(当然你接不接收,可以有,可以没有,反正我已经办好)--这是事件
      

  12.   

    收集的代码 事件和委托
    委托会在后面赋值的时候被覆盖,事件赋值一个执行一个,一下收集的测试代码
    ----------------系统委托EventHandler----------------------------事件(封装)
        public event SearchHandler search;
        public event SearchHandler Search {
            add {
                search += value;
            }
            remove {
                search -= value;
            }
        }
    --------------------------------------------------------------------简单的委托例子
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;namespace T2
    {
        //委托必须是参数类型和返回类型相同,并且用deletegate修饰
        class Computer
        {
            public int Add(int x, int z) {
                return x + z;
            }        public int Sub(int x, int z)
            {
                return x - z;
            }
            //属性委托
            public delegate int ComputerHander(int x, int z);
            public ComputerHander ch=null;
        }
        //类委托
        public delegate int ComputerHander(int x, int z);
    }using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;namespace T2
    {
        class Program
        {
            static void Main(string[] args)
            {
                //Computer的例子
                Computer c = new Computer();
                //调用类委托
                ComputerHander hander = c.Add;
                Console.WriteLine(hander(1,2));
                //调用属性委托
                c.ch = c.Sub;
                Console.WriteLine(c.ch(1, 2));        }
        }
    }
    --------------------------------------------------------------用方法做参数的委托
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;namespace T2
    {
        //定义一个业务逻辑类
        class HelloManager
        {
            //把委托作为方法的参数
            public void SayHello(string name, HelloHander hander) {
                hander(name);
            }
        }    //定义中国人类
        class Chinaes
        {
            public static void ChinesHello(string name) {
                Console.WriteLine("ChinesHello," + name);
            }
        }    //定义英国人类
        class English
        {
            public static void EnglishHello(string name)
            {
                Console.WriteLine("EnglishHello," + name);
            }
        }    //定义委托
        public delegate void HelloHander(string name);
    }
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;namespace T2
    {
        class Program
        {
            static void Main(string[] args)
            {
                //调用HelloManager的例子
                HelloManager h = new HelloManager();
                h.SayHello("哈哈",English.EnglishHello);
            }
        }
    }------------------------------------------------------------------自定义事件
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;namespace T2
    {   //自定义注册事件
        //猫是事件原,所以事件类型要在猫类里面定义
        class Cat
        {
            //定义委托
            public delegate void CryHander();
            //定义事件,委托类型
            public event CryHander CryEvent;
            public void Cry() {
                Console.WriteLine("猫大叫一声...");
                if (CryEvent != null) {
                    CryEvent();//执行事件
                }
            }
        }    //老鼠
        class Mouse {
            public void Run() {
                Console.WriteLine("老鼠逃跑了....");
            }
        }    //主人
        class Master {
            public void Weak() {
                Console.WriteLine("主人醒了....");
            }
        }
    }
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;namespace T2
    {
        class Program
        {
            static void Main(string[] args)
            {
                //动态注册事件
                Cat cat = new Cat();
                Mouse mouse = new Mouse();
                Master master = new Master();            //订阅事件,多播性
                cat.CryEvent += new Cat.CryHander(mouse.Run);
                cat.CryEvent += new Cat.CryHander(master.Weak);            //触发事件
                cat.Cry();
            }
        }
    }--------------------------------------带参数的事件
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;namespace T2
    {
        //事件类型
        public class QuestionEvenArgs : EventArgs
        {
            public string QuestionMes{get; set; }
        }
        //委托
        public delegate void QuestionHander(object sendr,QuestionEvenArgs e);
        //主持人类
        public class Host
        {
            public event QuestionHander AnswerQuestion;
            public string Name { get; set; }
            public string Question { get; set; }//问题
            //触发事件方法
            public void Start()
            {
                Console.WriteLine("大家好,我是:" + Name);
                Console.WriteLine("今天的问题是:" + Question);
                Console.WriteLine("请各位嘉宾开始回答");
                //通知所有嘉宾回答问题
                if (AnswerQuestion != null)
                {
                    AnswerQuestion(this, new QuestionEvenArgs { QuestionMes = Question });
                }
            }
        }
        //嘉宾抽象类--父类
        public abstract class Guest {
            public string Name { get; set; }        public abstract void Answer(object sendr, QuestionEvenArgs e);
        }
        public class GuestA : Guest
        {
            public override void Answer(object sendr, QuestionEvenArgs e)
            {
               
                Console.WriteLine(Name + ",这个问题是我考虑一下!");
            }
        }
        public class GuestB : Guest
        {
            public override void Answer(object sendr, QuestionEvenArgs e)
            {            Console.WriteLine(Name + ",这个问题我知道!");
            }
        }
        public class GuestC : Guest {
            public override void Answer(object sendr, QuestionEvenArgs e)
            {
                Host h = sendr as Host;
                Console.WriteLine(h.Name+",这个问题是"+e.QuestionMes+",我知道答案,但是我不告诉你");
            }
        }    public class Test {
            public static void Main(string[] args) {
                Host h = new Host { Name = "李咏", Question = "伦敦奥运什么时候开始?" };            GuestA a = new GuestA { Name = "AAA" };
                GuestB b = new GuestB { Name = "BBB" };
                GuestC c = new GuestC { Name = "CCC" };            h.AnswerQuestion += new QuestionHander(a.Answer);
                h.AnswerQuestion += new QuestionHander(b.Answer);
                h.AnswerQuestion += new QuestionHander(c.Answer);            h.Start();
            }
        }
    }
      

  13.   

    测试的时候,main函数里面直接初始化两个类,不过要先初始化Sender类,因为后面的Receiver类的构造函数需要传递一个Sender类的对象,两个类单独对象都初始化好后,调用Sender类的对象的方法TriggerEvent,次方法本来应该只输出"Trigger an event.",但是由于初始化Receiver类的时候,其内部绑定了事件,因此会自动触发OnEvent方法,同步输出"Received and handled an event."。
    这个例子说明了一个现象,虽然Receiver类OnEvent方法没有手动去执行,但是会因Sender类的对象的方法TriggerEvent的执行而一起被执行,这就是事件的触发。
    不过这个例子有一个BUG,就是当Receiver类未初始化的话,Sender类的对象的方法TriggerEvent执行会报错,那个Event为空,没做是否为空判断。
      

  14.   

    对于代码 public event EventHandler Event; 来说,这个 Event 是你暴露的一个名称,就好像属性名称似地,是用来引用一个对象的。而EventHandler则是Event的类型声明。你也可以写 public EventHandler Event; 也就是不写关键字 event。这就是声明了一个叫做Event的委托实例,但是它不是事件。
      

  15.   


    你的“委托”太俗了,根本不是委托的意思。事件就是委托,因此A观察B,就是因为B定义了一个委托类型的引用属性(或者叫做事件属性),然后A用一个委托实例赋值给了它(或者叫做注册了事件处理回调方法),于是B的事件触发时就会自动调用A的这个委托实例(在此也就是A里边实现的委托处理程序)了。而你说的“委托”,纯粹是生活中照搬“委托”二字,跟这里的委托是两个不同的概念。