您的位置:首页 > 编程语言 > C#

c# 委托 和 事件 的区别

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

 

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

但是,反编译之后会发现事件是私有类型的委托,并且有两个方法,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("老牛是哞哞叫");

        }

    }

 

 

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  事件 c# 委托