• 第07篇:C#星夜拾遗之delegate示例 拓荒者


    概念

    delegate即委托。如果你使用过C++或者js中的回调函数,你会更容易明白一些。在异步操作中常常使用回调函数,例如在Ajax中,当HttpRequest执行异步请求时,就需要有一个状态改变时的回调函数。回调函数其实是一个方法调用的指针,也称为函数指针。在C#中,当需要把方法作为参数进行传递时,就需要用到delegate

     

    简单委托示例

    定义一个委托,代码如下:

    private delegate string GetString();

    这个委托用来获取一个字符串。接下来在Main方法中调用:

    static void Main(string[] args)

    {

        int i = 20;

    //iToString方法作为参数传递给委托

        GetString getString = new GetString(i.ToString);   

        Console.WriteLine(getString());     //执行委托

    }

    这是委托最简单的例子了,之所以上这么一个简单的例子,只是为了让大家明白,委托并不是深不可测。

     

    多播委托

        所谓多播委托,其实就是可以通过 + += 实现多个方法相加,同样可以通过 - -= 实现方法相减。我们在Windows窗体编程中,为一个按钮添加单击事件,就可以看到这样的代码:

    this.button1.Click += new System.EventHandler(this. button1_Click);

        通过多播委托我们可以为Click事件添加更多的处理函数,代码如下:

    this.button1.Click += new System.EventHandler(this. button1_Click1);

     

    如果想要删除一个方法,可以通过下面的代码实现:

    this.button1.Click -= new System.EventHandler(this. button1_Click);

     

    匿名方法

        匿名方法是用作委托参数的一个代码块。也就是说可以不对传给委托的方法命名,只需要将委托执行的代码写在一个指定的代码块中即可。下面的代码实现一个匿名方法的委托:

    //这个委托定义说明,要执行的方法返回值为void,参数为string类型

    private delegate void ShowString(string Text); 

     

    static void Main(string[] args)

    {

        string str = "这是一个匿名方法";

     

        ShowString ss = delegate(string Text)

        {

            Console.WriteLine(Text);

        };

        WriteString ws = new WriteString();

        ss += new ShowString(ws.write);

        ss.Invoke(str);

    }

     

    Lambda表达式

        C# 3.0中为匿名方法提供了一个新的语法:Lambda表达式。Lambda可用于委托类类型。想了解更多请参考MSDNLambda 表达式(C# 编程指南)

        下面是一个Lambda的例子,可以了解一下用法:

    //这个委托定义说明,要执行的方法返回值为void,参数为string类型

    private delegate void ShowString(string Text1, string Text2); 

     

    static void Main(string[] args)

    {

        string str1 = "第一个字符串";

        string str2 = "第二个字符串";

     

        // λ运算符 >= 左边列出委托需要的参数,如果为一个参数,可以省略()

        ShowString ss = (Text1, Text2) =>                      

        {

            // 运算符右侧为 方法或匿名方法,如果方法只有一行时可以省略 {}

            Console.WriteLine(Text1 + "\n" + Text2);

        };

     

        ss(str1, str2);

    }

     

     

    结束语

    最后,还是那句老话,如果希望了解更多,还是多用,多查。实践是走向成功的必由之路。在最后的最后,提供出来本文示例的下载SampleDelegateTest.rar

    2021年9月 北京、西安两地,高薪诚聘 .NET工程师,请私信联系!
    如果认为此文对您有帮助,别忘了支持一下哦!
    声明:本博客原创文字只代表本人工作中在某一时间内总结的观点或结论,与本人所在单位没有直接利益关系。转载时请在文章页面明显位置给出原文链接。
  • 相关阅读:
    无题
    1.1tensorflow2.0 张量
    某某大肠_tidb_集群创建用户
    某某大肠_替换TiDB 3.0集群的tidb-server命令工具
    某某大肠_配置spark的thriftserver模块
    date_and_time
    SpringBoot整合Mybatis
    SpringBoot(3)Thymeleaf使用详解
    SpringBoot(2)实现CRUD
    SpringBoot(1)入门篇
  • 原文地址:https://www.cnblogs.com/youring2/p/1736509.html
Copyright © 2020-2023  润新知