A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

委托和事件谁能详细的给我说下是怎么个回事?
还是不怎么理解,最好是简单地例子代码,能理解的,太久不看书不记得了

6 个回复

正序浏览
委托可以把一个方法作为参数代入另一个方法。
委托可以理解为指向一个函数的引用。
事件是一种特殊的委托
回复 使用道具 举报
委托可以把一个方法作为参数代入另一个方法。
委托可以理解为指向一个函数的指针。
委托和事件没有可比性,因为委托是类型,事件是对象,下面说的是委托的对象(用委托方式实现的事件)和(标准的event方式实现)事件的区别。事件的内部是用委托实现的。因为对于事件来讲,外部只能“注册自己+=、注销自己-=”,外界不可以注销其他的注册者,外界不可以主动触发事件,因此如果用Delegate就没法进行上面的控制,因此诞生了事件这种语法。事件是用来阉割委托实例的,类比用一个自定义类阉割List。事件只能add、remove自己,不能赋值。事件只能+=、-=,不能= 。加分的补充回答:事件内部就是一个private的委托和add、remove两个方法
回复 使用道具 举报
本帖最后由 周琪 于 2013-5-18 13:12 编辑


我总结了一下:委托和事件一共有以下几点区别:
    1。事件只能在声明他的那个类或结构中被调用
   2.事件包含add,remove,和一个私有委托。故一般只看见-=和+=用法
  
第一个比较简单,你可以看下

    class Program
    {

        static void Main(string[] args)
        {
            ClassA ca = new ClassA();
            MyDel md = new MyDel(ClassA.Print);
         
            md += ca.PrintStr;
            md();  //多播委托

            StaticPrint(ca.PrintStr);  
            StaticPrint(ClassA.Print);
            Console.ReadKey();
         }
        static void StaticPrint(MyDel m)//委托做参数存方法
        {
            m();
        }
    }
    public delegate void MyDel();
    public  class ClassA
    {
        public static void Print()
        {
            Console.WriteLine("这是静态方法。。。。");
        }
        public void PrintStr()
        {
            Console.WriteLine("这是实例方法");
        }
    }


==================================================第二个=================================
class MyEventArg
    {
        public string Name { set; get; }
        public string Tele { set; get; }
    }
    class Program
    {

        static void Main(string[] args)
        {
            ClassA a = new ClassA();
            a.MyEvent += a.Print;
            MyEventArg news = new MyEventArg() { Name = "zhouqi", Tele = "123456789" };
            a.ConSoleNews(a, news);
            Console.ReadKey();


        }
    }
    delegate void MyEventHandler(object sender, MyEventArg e);
    class ClassA
    {
        public event MyEventHandler MyEvent;   //定义一个事件
        public void ConSoleNews(object sender, MyEventArg e)
        {
            MyEvent(sender, e);  //只能在声明事件的类或结构中调用事件
        }
        public void Print(object obj, MyEventArg msg)
        {
            Console.WriteLine(msg.Name + "  " + msg.Tele);
        }
    }











回复 使用道具 举报
郑丹丹1990 发表于 2013-5-16 21:15
您的回答每次都让人回味悠长呀!

~~谢谢!
回复 使用道具 举报
许庭洲 发表于 2013-5-16 20:04
1. 委托和事件没有可比性,因为委托是类型,事件是对象;
2. 事件的内部是用委托实现的;
...

您的回答每次都让人回味悠长呀!
回复 使用道具 举报
1. 委托和事件没有可比性,因为委托是类型,事件是对象;
2. 事件的内部是用委托实现的;
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马