c# 委托 和 事件 的区别

来源:互联网 发布:阿里云干什么的 编辑:程序博客网 时间:2024/05/20 18:04

据说这是一个面试题。我刚开始学的时候不怎么理解,只简单的认为委托是可以将方法作为参数传入另一个方法中的,当你的参数需要一个方法的时候就可以使用委托。

 

委托是一种特殊的数据类型,事件是对象,本来没有可比性,又偏偏喜欢这样问。。

但是,反编译之后会发现事件是私有类型的委托,并且有两个方法,add,remove方法。

因此事件还只能供内部调用,而且,add方法不会将之前的调用覆盖,所以事件是相对安全的。

如下代码:

class Program
    {
        static void Main(string[] args)
        {
            Say.DgSayHi dsh = Goat.SayHi;
            //Say.EventSay es = Goat.SayHi;//报错,不存在类型名EventSay
            dsh = Cow.SayHi;//容易被覆盖
            dsh();
           
            //Console.WriteLine(str);
            Console.WriteLine("==================================");
            //Say.EventSay es += new DgSayHi(Goat.SayHi);X 说明事件是一个对象,而不是类型
            Say.EventSay += new Say.DgSayHi(Dog.SayHi);
            //Say.EventSay("小狗");//报错, 事件“Say.EventSay”只能出现在 += 或 -= 的左边
            //(从类型“Say”中使用时除外)
            Say.EventSay += new Say.DgSayHi(Cow.SayHi);
            Say.GoSay();          
          
            Console.ReadKey();

        }
    }

    class Say
    {
        public delegate void DgSayHi();//声明一个代理
        public static event DgSayHi EventSay;//仅仅相当于一个字段的声明
         public static void GoSay()
        {
            //触发事件          
             EventSay?.Invoke();
        }
    }

//反编译后


   

class Goat
    {
        public static void SayHi()
        {
            Console.WriteLine("山羊是咩咩叫");
        }
    }
    class Dog
    {
        public static void SayHi()
        {
            Console.WriteLine("小狗是汪汪叫");
        }
    }
    class Cow
    {
        public static void SayHi()
        {
            Console.WriteLine("老牛是哞哞叫");
        }
    }

 

 

 

 

1 0
原创粉丝点击