C#委托与事件

来源:互联网 发布:算量软件有哪些 编辑:程序博客网 时间:2024/06/15 06:02

C#里面的委托与C++里面的函数指针类似。

委托是一种自定义类型,是一种函数类型(理解为自定义的一种变量)

delegate void input(string);//这样声明了一个可以存放函数的类型,要求函数是返回值为void,有一个string的参数Input相当于是个类型名,不是变量名因此需要声明一个变量

input a=aaa;///a是input类型的变量,aaa是static void aaa(string)函数

当然也可以作为函数的参数,与其他变量用法一样

Action委托

Action委托是自定义的一种委托类型,没有返回值,没有参数,所以如果想存储一个无返回值无参数的函数可以直接Action a=aaa;不需要delegate声明

Action<int> a;表示一个有一个int参数无返回值,Action<int a,int a>同上

Func委托

Func委托同上,他是一个必须有返回值,可以有无参数的委托类型。

Func<int,string> a = aaa;//最后一个参数是返回类型,前面的都是参数类型,同Action0~16个参数

Event事件

*事件的声明只能在类里面,作为类的一个成员。

elegate void input(string);//声明了一个委托类型

public event input myinput;//声明了一个委托类型的变量

事件可以理解为是一个数组(委托类型的数组),当触发这个事件的时候这个数组里面的函数都会被调用。比如有一只猫,N只老鼠,当猫来的时候老鼠要逃跑。可以再猫这个类里面声明一个事件。在老鼠的构造函数里面去添加事件(每声明一个老鼠,这个老鼠的逃跑函数就存到了猫里面的事件里面了)。当调用猫的事件的时候所有的老鼠都会跑了

 class Cat

    {

        private string name;

        private string color;

        public Cat(string name,string color)

        {

            this.name = name;

            this.color = color;

        }

        public void CatComing()

        {

            Console.WriteLine(color+"的猫"+name+"过来了,喵喵喵 ...");

            if(catCome!=null)

                catCome();

        }

        public event Action catCome;//声明一个事件 发布了一个消息

}

class Mouse

    {

        private string name;

        private string color;

        public Mouse(string name,string color,Cat cat)

        {

            this.name = name;

            this.color = color;

            cat.catCome += this.RunAway;//把自身的逃跑方法注册进猫里面的事件里面

        }

        public void RunAway()

        {

            Console.WriteLine(color+"的老鼠"+name+"说: 老猫来, 赶紧跑, 我跑, 我使劲跑,我加速使劲跑 ...");

        }

}

        static void Main(string[] args) {

            Cat cat = new Cat("加菲猫","黄色");

            Mouse mouse1 = new Mouse("米奇","黑色",cat);

            Mouse mouse2 = new Mouse("水","红色", cat);

            cat.CatComing();//触发事件,事件里面的所有老鼠身上的逃跑函数都会触发

            //cat.catCome();//事件不能再类的外部触发,只能在类的内部触发

            Console.ReadKey();

        }

注意:添加删除事件只能用+=,-=;

原创粉丝点击