前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C#-委托与事件

C#-委托与事件

作者头像
祝你万事顺利
发布2019-05-29 18:21:20
3800
发布2019-05-29 18:21:20
举报
文章被收录于专栏:Unity游戏开发Unity游戏开发
委托

委托:是一个类、是一种数据类型 定义语法: 访问修饰符 关键字(delegate) 返回值 标识符(参数列表) 委托的绑定:和委托的返回值一样,参数一样的方法都可以绑定到此委托 委托链的使用:通过+=、-=给委托链添加和删除一个绑定方法。 委托使用之前需要先定义 三种使用方式: 1.直接方法赋值使用 2.匿名函数使用: 匿名函数法:delagate + 参数 + 方法体{return 返回值默认值;} 3.Lambda表达式使用: 格式:(参数)=>{} 当只有一个参数,一个返回值的时候,写Lambda表达式时,可以将参数的小括号、参数的类型省略,将方法大括号,return语句的return也省略,语句后的分号也可以省略。

代码语言:javascript
复制
namespace 委托
{
    delegate void MyDelegate();

    class Program
    {
        static void Main(string[] args)
        {
            Person person = new Person();
            person.SayHello(Fun);
        }
        static void Fun()
        {
            Console.WriteLine("xixi");
        }
    }

    class Person
    {
        public void SayHello(MyDelegate dele)
        {
            dele();
        }
    }
}
代码语言:javascript
复制
//创建委托对象
            MyDelegate dele1 = new MyDelegate(Fun);
            MyDelegate dele2 = Fun;
            MyDelegate dele3 = dele1;
            //调用委托对象
            dele1();
            dele2();
            dele3();

委托:一个委托对象可以绑定多个方法,只要方法签名和其一致即可以绑定,委托对象在调用时,会依次执行绑定的方法,卸载未曾绑定的方法不会报错.

代码语言:javascript
复制
... ...
ColDelegate col = new ColDelegate(Add);
            
            col += Sub;
            col -= Add;

            Console.WriteLine(col (5, 10));
        }

        static int Sub(int a, int b)
        {
            return a - b;
        }

        static int Add(int a, int b)
        {
            return a + b;
        }

委托中方法的表现形式 除了常规的表现形式还有匿名函数和Lambda表达式

代码语言:javascript
复制
//匿名函数:delegate(形参列表){}
            Person student11 = new Person();
            student11.SayHello(delegate () { Console.WriteLine("222"); });
            ColDelegate col2 = delegate (int a, int b) { return a / b; };
            Console.WriteLine(col2(20,10));

            //Lambda 表达式
            //省略某些元素:当只有一个参数时,可以只写形参,
            //当方法体为一条有返回值的语句,可以省略{}和return 关键字
            StrDelegate myStr = (int a) => { return a.ToString(); };
            StrDelegate str = a => a.ToString();

通过委托来实现前面的排序,以实现我们可以随意定义两个比较的是什么东西 委托的两个参数为泛型以此来实现,任意类型

代码语言:javascript
复制
delegate bool ComAmyObj<T>(T a,T b);
//对任意可比较类型数据进行升序排序
    class MyClass01
    {
        public T[] ArraySort<T>(T[] t,ComAmyObj<T> comAmyObj) //where T : IComparable
        {
            if (t.Length > 1)
            {
                for (int n = 0; n < t.Length; n++)
                {
                    for (int m = 0; m < t.Length - n - 1; m++)
                    {
                        //如果前者大于后者
                        if (comAmyObj(t[m], t[m + 1]))
                        {
                            T temp = t[m + 1];
                            t[m + 1] = t[m];
                            t[m] = temp;
                        }
                    }
                }
            }
            return t;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            MyClass02[] c1 = new MyClass02[3];
            c1[0] = new MyClass02();
            c1[0].i = 11110;
            c1[1] = new MyClass02();
            c1[1].i = 230;
            c1[2] = new MyClass02();
            c1[2].i = 10;

            MyClass01 c3 = new MyClass01();
            // c1 = c3.ArraySort<MyClass02>(c1);
            c1 = c3.ArraySort<MyClass02>
                (c1, (MyClass02 i, MyClass02 j) => { if (i.i > j.i) { return true; } else return false; });
            Console.WriteLine(c1[0].i);
            Console.WriteLine(c1[1].i);
            Console.WriteLine(c1[2].i);
        }
    }

事件

event是一种定义好的数据类型,对委托对象实现封装,保护委托对象不被直接复制修改。在非声明事件的类,只可以用+=、-=的方式,挂载、卸载事件。 声明语法:访问修饰符 event 委托 名字;

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019.04.24 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 委托
  • 事件
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档