zoukankan      html  css  js  c++  java
  • 03.C#委托(二章1.1)

      一章1.5-1.8介绍的是com、动态类型及.NET平台一些说明,每个心中都有自己的标准,听一家之言,叫人不爽,相信自己有自己的标准和自己的编程理念就OK了,也不想码那么多说明性的文字,直接跳过吧,当然自己还是看过了。进入正题,这篇来说一下委托(在深入理解C#的同时,我也在学C++,委托确实和函数指针有相似的地方,大家也可以去了解下。)

      委托的四个基本构成:

    1. 委托类型的声明
    2. 满足委托类型签名的方法
    3. 委托类型实例
    4. 调用委托实例

      声明委托使用delegate关键字

    1 public delegate void Drive(string name);

      如上,声明了一个委托类型Drive,由System.MulticastDelegate派生,而System.MulticastDelegate又是继承于System.Delegate,该类型有自己的方法和属性。与该类型匹配的方法的签名必需使用一个string类型作为参数和返回一个void类型(即不返回),可以是静态方法或者一个实例方法。

     1 public class Car
     2     {
     3         //实例方法
     4         public void Drive(string name)
     5         {
     6             Console.WriteLine(name + "正在开车!!!");
     7         }
     8 
     9         //静态方法
    10         public static void StaticDrive(string name)
    11         {
    12             Console.WriteLine(name + "正在开车!!!");
    13         }
    14     }

      如上,Car类中的Drive方法是一个实例方法,使用该方法前要有一个Car类型的实例,StaticDrive是一个静态方法,使用类作用域便可以调用,且上述两个方法的签名均满足上述委托对于方法签名的要求。

      接下来要创建一个Drive类型的委托实例,并且去调用。

     1 class Program
     2     {
     3         static void Main(string[] args)
     4         {
     5 
     6             //声明两个委托实例
     7             Drive drive0, drive1;
     8             Car car = new Car();
     9 
    10             //对委托实例进行赋值,一个使用静态方法,一个使用实例方法
    11             drive0 = new Drive(Car.StaticDrive);
    12             drive1 = new Drive(car.Drive);
    13 
    14             //调用委托实例方法
    15 
    16             //使用委托实例中的Invoke方法进行调用
    17             drive0.Invoke("Leo");
    18             //使用简写方法
    19             drive1("DuDu");
    20 
    21             Console.ReadKey();
    22 
    23         }
    24     }

      上术只是对一个简单操作的调用,委托更多的情况使用于多个操作联合使用。可以使用Delegate.Combine和Delegate.Remove对操作的增减,一般使用简写方式+=和-=。

     1 class Program
     2     {
     3         static void Main(string[] args)
     4         {
     5 
     6             //声明两个委托实例
     7             Drive drive0, drive1;
     8             Car car = new Car();
     9 
    10             //对委托实例进行赋值,一个使用静态方法,一个使用实例方法
    11             drive0 = new Drive(Car.StaticDrive);
    12             drive1 = new Drive(car.Drive);
    13 
    14             //调用委托实例方法
    15 
    16             //使用委托实例中的Invoke方法进行调用
    17             drive0.Invoke("Leo");
    18             //使用简写方法
    19             drive1("DuDu");
    20 
    21 
    22             drive0 += drive1;
    23             drive0.Invoke("Leo");
    24 
    25             Console.ReadKey();
    26 
    27         }
    28     }

      运行结果如下:

      使用+=或者-=操作能更加方便,且利于理解。

      

  • 相关阅读:
    Linux内核中锁机制之RCU、大内核锁
    Linux内核中锁机制之完成量、互斥量
    Linux内核中锁机制之信号量、读写信号量
    Linux内核中锁机制之内存屏障、读写自旋锁及顺序锁
    Linux内核中锁机制之原子操作、自旋锁
    Linux内核jiffies简介
    pdflush机制
    ext2文件系统
    从ext2文件系统上读出超级块
    ext2磁盘布局
  • 原文地址:https://www.cnblogs.com/a2htray/p/4185677.html
Copyright © 2011-2022 走看看