zoukankan      html  css  js  c++  java
  • C# 委托详解(一)

    1.委托简单例子

     class eeProgram
        {
            // 声明delegate对象   
              public delegate string CompareDelegate(int a, int b);
             // public static CompareDelegate ceshi = new CompareDelegate(Program.Compare);
    
            // 欲传递的方法,它与CompareDelegate具有相同的参数和返回值类型 
            public static string Compare(int a, int b)
            {
                return (a + b).ToString();
            }
            public static void Main()
            {
                // 创建delegate对象   
              CompareDelegate cd = new CompareDelegate(eeProgram.Compare);
              Console.WriteLine(cd(2, 1)); //3
            } 
    }

      首先是C#语法

    public delegate void BugTicketEventHandler();
    //delegate 是关键词,【注:EventHandler是一个声明委托的微软C#的命名标准,我的习惯是标准就要第一时间说,也就这个命名习惯要第一时间养成】

    public void BuyTicket()
    {
        方法体
    }

    区别知道了吧,在现实生活中,委托只是个命令,做事情是别人,而在程序世界里委托只是存储了各个方法的地址,而他自己也是什么也不做的。


     那我们就把刚才那个,小明委托小张去买车票的现实生活场景,怎么在程序世界里体现呢?

    //小张类
        public class MrZhang
        {
            //其实买车票的悲情人物是小张
            public static void BuyTicket()
            {
                Console.WriteLine("NND,每次都让我去买票,鸡人呀!");
            }
        }
    
        //小明类
        class MrMing
        {
            //声明一个委托,其实就是个“命令”
            public delegate void BugTicketEventHandler();
    
            public static void Main(string[] args)
            {
                //这里就是具体阐述这个命令是干什么的,本例是MrZhang.BuyTicket“小张买车票”
                BugTicketEventHandler myDelegate = new BugTicketEventHandler(MrZhang.BuyTicket);
    
                //这时候委托被附上了具体的方法
                myDelegate();
                Console.ReadKey();
            }
        } 

     BugTicketEventHandler myDelegate = new BugTicketEventHandler(MrZhang.BuyTicket);

    这是委托的声明方法, BugTicketEventHandler(委托的方法);委托的方法必须要加上,因为委托的构造函数是不为空的。

    注:委托的参数和返回类型,都要和你要具体委托的方法要一致,例:

      public delegate void BugTicketEventHandler();

      public static void BuyTicket()
      {
       Console.WriteLine("NND,每次都让我去买票,鸡人呀!");
      }

       同学们,看到这里可以先消化消化,休息一下,我们简单的讲一下委托链的概念:

       其实委托链也是相当的简单,在现实生活中,小明叫小张买完车票之后,可能接着又让他带张电影票,

       而我们程序世界里的表述为:

    //小张类
        public class MrZhang
        {
            //其实买车票的悲情人物是小张
            public static void BuyTicket()
            {
                Console.WriteLine("NND,每次都让我去买票,鸡人呀!");
            }
    
            public static void BuyMovieTicket()
            {
                Console.WriteLine("我去,自己泡妞,还要让我带电影票!");
            }
        }
    
        //小明类
        class MrMing
        {
            //声明一个委托,其实就是个“命令”
            public delegate void BugTicketEventHandler();
    
            public static void Main(string[] args)
            {
                //这里就是具体阐述这个命令是干什么的,本例是MrZhang.BuyTicket“小张买车票”
                BugTicketEventHandler myDelegate = new BugTicketEventHandler(MrZhang.BuyTicket);
    
                myDelegate += MrZhang.BuyMovieTicket;
                //这时候委托被附上了具体的方法
                myDelegate();
                Console.ReadKey();
            }
        } 

    其实,我们只是在程序中加了 myDelegate += MrZhang.BuyMovieTicket;

    这时这个委托就相当于要做2件事情,先是买车票,再是买电影票拉!

    其他:委托例子

    class Program
        {
            static void OtherClassMethod()
            {
                Thread.Sleep(3000);
                Console.WriteLine("Delegate an other class's method--3");
            }
    
            static void Main(string[] args)
            {
    
                var test = new TestDelegate();
                 test.delegateMethod += test.NonStaticMethod;
                test.delegateMethod += TestDelegate.StaticMethod;
                 test.delegateMethod += Program.OtherClassMethod;
                test.RunDelegateMethods();
    
                Console.WriteLine("Finished");
                char ch = (char)Console.Read();
                Console.WriteLine("Your key is: " + ch);
    
                //---------
                //Delegate a non-static method--2
                //Delegate a static method--1
                //Delegate an other class's method--3
                //---------
                //Finished
            }
        }
    
        class TestDelegate
        {
            public delegate void DelegateMethod();  //声明了一个Delegate Type
    
            public DelegateMethod delegateMethod;   //声明了一个Delegate对象
    
            public static void StaticMethod()
            {
                Thread.Sleep(2000);
                Console.WriteLine("Delegate a static method--1");
            }
    
            public void NonStaticMethod()
            {
                Thread.Sleep(2000);
                Console.WriteLine("Delegate a non-static method--2");
            }
    
            public void RunDelegateMethods()
            {
                if (delegateMethod != null)
                {
                    Console.WriteLine("---------");
                    delegateMethod.Invoke();
                    Console.WriteLine("---------");
                }
            }
        }
  • 相关阅读:
    SpringCloud高可用和高并发
    时间重要性,我们需要如何利用极致
    Spring是什么 包括SpringBean SpringMVC SpringBoot SpringCloud
    Java 线程的基本使用
    JVM 内存模型
    Java 8 ArrayList 详解
    Java 8 HashMap 源码解析
    Docker 运行 MySQL,使用 docker-compose
    Spring Boot 主从读写分离
    Spring Boot 整合 MyBatis 实现乐观锁和悲观锁
  • 原文地址:https://www.cnblogs.com/zhangtaotqy/p/7991226.html
Copyright © 2011-2022 走看看