C#委托与事件

一 、

1、让函数以变量的身份出现,成为别人的参数。

2、int f(int x,int y);      //定义一个函数

      g(f)   //该函数作为参数,对应于C语言的函数指针

3、

例子:

          delegate int D(intx, int y)         //定义一个类,是委托类型D

            class A

          { 

                static int f (int x,int y)

                     {

                           return  x+y;

                     }

               static void main()

                    {

                           D  d = f;          //生成D类的一个对象d,把f作为d的初值函数

                         int z = int d(1,2);    //z为对象d的返回值

                          Console.WriteLine("z = {0}",z);

                    }

         }

二、

1、class和delegate处于同等地位,可以使用protected,private,public等修饰符进行修饰

2、初始化对比:

         class A = new class();     //  初始化类A

         D  d = new D(f);            // f是一个函数,是D的参数

         D  d = new D();           //错误,因为委托类型D必须有构造函数的参数

         D  d = f ;                     //不适用new 关键字

3、委托赋值:

        D  d = f();   //错误

 

        D  d = f(int x,int y);  //错误,这个时候d是f的替身,所以在y中带参数

        d(3,2);                //正确

        d.Invoke(3,2);         //正确,使用Invoke方法

三、

1、符合委托签名的函数都可以使用委托,静态函数和对象函数都可以

2、例子:

       class B

        {

             public int f(int x,int y)

                  {

                     return x*y;             

                  }

        }

        B b = new B();    //生成类B的对象b

        delegate int D(int x,int y);   //定义一个委托类D

        D d = b.f;     //定义委托对象的委托事件是对象b的函数

四(委托做参)、

1、委托作用:主要用在运行时才能决定的动作,这些动作在事先是不知道的。例如用户选择的操作是什么,编程者并不知道。这个时候要用到委托事件。

2、委托是一个函数的替身,委托是委托类的对象,就可以类似于 int x这样的整形变量作为函数参数进行传递。

例子:

     delegate void D(string s);   //定义一个委托类D

     class A

            {

 

             static void read(string s)

                  {

                       Console.WriteLine("读"  + s);

                  }

             static void write(string s)

                  {

                        Console.WriteLine("写" + s);

                  }

               static void study(string s,D d)          //定义类一个函数study,有两个参数,一个是字符串s另一个是委托对象d

                 {

                        d(s);

                 }

                static void Main()

                {

                        study("三国",read);              //该study函数参数d使用的是本类的read函数,拿read来代替d,相当于D d =read;

                        study("红楼",write);

                        Console.Read();

                        /*

                          或者

                          D d1 = read;

                          D d2 = write;

                          study("三国",d1);

                          study("红楼",d2);

                        */

               }              

            }

对比:

     class A 
        {

              string  x;

              string  y;

              void  study(string  z)

             {

              Console.WriteLine(z);

              }

             void main()

             {

                 study(x);

                 study(y);              

             }

         }

 

 

 

        

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值