zoukankan      html  css  js  c++  java
  • 总结:C# 委托的全面理解

    在说事件之前得先了解委托。
    委托,外表看来和C/C++中函数指针没什么区别,但是本质上你才发现他其实就是个类!也就是说理解委托得从
    这个两个方面去理解(单从一个方面去理解感觉就怪怪的呵呵!)

    理解委托:
    什么是委托?委托是c#中类型安全的,可以订阅一个或多个具有相同签名方法的函数指针。
    声明一个委托,相当于声明了一个是函数指针类型,委托是一种类型,进一步说,他就是一个类!
    他的目的就是,将方法可以作为其他方法的参数传递!进一步说,就是一个方法内部需要调用另一种方法
    (及方法内部还有一个方法),且这个内部调用的方法存在多样性。那么最好的方法就是将内部的方法作为外
    部的方法的参数数进行传参~~

    委托的形式:
        声明委托的方式:delegate 返回值类型 委托类型名(参数)
    比如delegate void deleProcess(string s);
    注意这里的除了前面的delegate,剩下部分和声明一个函数一样,但是deleProcess不是函数名,而是委托类型名!

    委托的使用:
          委托是c#中,可以订阅一个或多个具有相同签名方法的函数指针。所以说委托的使用和函数指针的使用是差不多的。
    把它想象成一个指针就知道怎么用了~~但是委托又不能完全的看成一个函数指针(本质上是个类),这是因为委托考虑到更多的安全性,
    它需要存储特定方法的细节。所以,定义好委托后,还需要创建一个委托实例,才可以使用(以存储特定方法的细节)!
    假设有一个函数是:void SayHi(String s); 这个正好和delegate void deleProcess(string s);这个委托的签名一致。
    那么我们开始使用委托:
    deleProcess pro = new deleProcess(SayHi);//实例化一个委托,并且用SayHi方法初始化它。
    deleProcess pro = SayHi;  //这是上面的简写形式,编译器帮我们进行了new!看上去是直接与方法关联(看起来有指针的感觉呵呵),其实还是通过委托!
    注意SayHi以及pro都没有带“括号”的这是应为如果带上括号就是方法的调用了。好了当委托指向方法成功之后。
    pro(s)就和SayHi(s),达到同一个目的了。
    最终的目的委托是为了方法作为方法的参数:
    viod GreetPeople(string name, deleProcess pro)//这个GreetPeople方法,就利用了委托将方法作为参数了!
    {
          pro(name);//pro用起来就和方法是一样的~~
    }
    如此就可以把SayHi方法作为参数传递了:
    GreetPeople(song,SayHi);
    //摘抄自《C#高级编程》
    委托的一个特征是它们的类型是安全的,可以确保被调用的方法签名是正确的。
    但有趣的是,它们不关心调用该方法的是什么类型的对象,甚至不考虑该方法
    是静态方法,还是实例方法。
    提示:
    给定委托的实例可以表示任何类型的任何对象上的实例方法或静态方法——只要方法
    的签名匹配于委托的签名即可。
    //-------------------------------------------------------------------------------------------------------------
    //委托使用的例子~~
    delegate string ProcessDelegate(string s);
    static void ProcessIntArray(ProcessDelegate p)
            {
                string[] values = new string[] { "aB","Cd"};
                for (int i = 0; i < values.Length; i++)
                {
                    values[i] = p(values[i]);
                }
                Console.WriteLine("处理后");
                foreach (string s in values)
                {
                    Console.WriteLine(s);
                }
            }
    编写函数,大写、小写、加引号
    进一步体会:和直接调用函数的区别:用委托就可以指向任意的函数,哪怕是之前没定义的都可以,而不使用受限于那几种。

  • 相关阅读:
    AnaConda环境下安装librosa包超时
    [浙江大学数据结构]多项式求值,及算法效率问题
    java正则表达式测试用例
    tK Mybatis 通用 Mapper 3.4.6: Example 新增 builder 模式的应用
    Detect image format in Java(使用java探测图片文件格式)
    使用ColumnType注解解决/过滤/转义tk mybatis插入insertSelective、insert语句中遇到sql关键字
    IDEA中关闭sonar代码质量检测
    pip设置安装源
    无法修正错误,因为您要求某些软件包保持现状,就是它们破坏了软件包间的依赖关系
    sql 查出一张表中重复的所有记录数据
  • 原文地址:https://www.cnblogs.com/douzi2/p/4285277.html
Copyright © 2011-2022 走看看