zoukankan      html  css  js  c++  java
  • Intern Day83

    为什么引入委托

    C#委托最最简单的说法:委托的作用是用来传方法的。

    一般的方法/函数只能用来传参数,当需要方法作为参数传递的时候,需要引入 委托

    委托规则

    1. 委托和所要传的方法的返回值类型要一致。

    2. C#中定义委托用 delegate 关键字。

    3. 对于一个委托类型,可以创建它的实例,并使这个实例指向一个具体的方法。而这个方法的签名(无论方法具体完成什么功能)必须要与委托类型的定义一致。

    4. c#用委托来实现事件通知机制。相当与c++函数指针。

    委托的基本实现见下面代码。

    委托的多播

    委托支持多播。

    多播就是同一个委托实例可以指向多个方法,只要调用这个实例,所有方法就会按顺序执行。要向一个委托实例添加方法用 += ,要移除(多个)方法用 -=

    委托的多播的基本代码的实现见下面,都写在一起了,便于比较着来看。

    定义委托的方法

    1. 一般定义

    2. 匿名方法

    3. Lambda表达式

    具体见下面代码

    具体代码

    using System;
    using System.Diagnostics;
    using System.Net.NetworkInformation;
    using System.Reflection;
    using System.Security.Cryptography;
    
    namespace Practice1 // namespace 索引器
    {
        public class DelegateTest
       {
           public int Add(int x, int y) // int Add(int x, int y
           {
               Console.WriteLine($"{nameof(Add)}:{x}+{y}={x+y}"); 
               // 使用 nameof 操作符来获得名字字符串。(即接收元素值返回元素名)
               // ${}:包裹一个变量或表达式
               return x + y; // 不写return会报错
           }
           
           public int Subtract(int x, int y) 
           {
               Console.WriteLine($"{nameof(Subtract)}:{x}-{y}={x-y}");
               return x - y;
           }
           
           public int Multiply(int x, int y) 
           {
               Console.WriteLine($"{nameof(Multiply)}:{x}*{y}={x*y}");
               return x * y;
           }
           
           // Divide
       }
        
        // 定义一个委托类型
       public delegate int Cal(int x, int y);
       
       class Program
       {
           static void Main(string[] args)
           {
               var test = new DelegateTest();
          
               // 定义三个委托实例Cal,指向不同的方法
               Cal add = new Cal(test.Add);
               Cal sub = new Cal(test.Subtract);
               Cal mul = new Cal(test.Multiply);
               
               // ---------------------------------------------------------------------
               
               // 上面add用下面这个代替,就是用 匿名方法 来实现委托实例
               /*
               Cal add = delegate(int x, int y)
               {
                   Console.WriteLine($"{nameof(Add)}:{x}+{y}={x+y}");
                   return x + y; 
               };
               */
               
               // 上面add用下面这个代替,就是用 Lambda表达式 来实现委托实例
               /*
               Cal add = (int x, int y) =>
               {
                   Console.WriteLine($"{nameof(Add)}:{x}+{y}={x+y}");
                   return x + y; 
               };
               */
               
               // ---------------------------------------------------------------------
               
               // 执行委托
               int resultAdd = add(5,3);
               int resultSubtract = sub(5,3);
               int resultMultiply = mul(5,3);
               
               // Console.ReadKey(); // 读取一个字符 不管输多少,只读一个字符结束
               // Console.Read(); // 读取一行 输入多少都会读取然后结束
               Console.ReadLine(); // 读取一行+回车 输入多少都会读取然后再读取到一个回车才结束
               
               // ---------------------------------------------------------------------
               
               // 委托的多播
               Cal cal = new Cal(test.Add); 
               cal += test.Subtract;
               cal += test.Multiply; 
               // 注意!并不是ans=(ans+x-y)*z连着加减乘,而是每一步都是分开计算的
               int ans = cal(5,3);
               Console.WriteLine(ans);
           }
       }
    }
    

    输出:

    Add:5+3=8
    Subtract:5-3=2
    Multiply:5*3=15
    k
    Add:5+3=8
    Subtract:5-3=2
    Multiply:5*3=15
    15 //解释:如果委托类型的定义中具有返回值,那么多播委托执行后的返回值是最后一个方法的返回值,所以ans就是Multiply方法的返回值。
    

    参考

    公众号 .NET之窗 的文章:《C#中的委托与事件》(关于项目中如何使用可以看看,目前我没用到)

  • 相关阅读:
    Ruby 集合数组常用遍历方法
    Git,Github和Gitlab简介和基本使用
    L1-Day14
    学习进度(2)
    求数组的子数组的最大值(文件存储)
    开学第一课博客——自我介绍
    求数组的子数组的最大值
    学习进度(1)
    java web+模板
    android开发环境配置以及测试所遇到的的问题
  • 原文地址:https://www.cnblogs.com/OFSHK/p/14755499.html
Copyright © 2011-2022 走看看