• C#委托,事件,匿名委托


    作为一个初学者,写下来是当做自己的学习笔记,希望在以后遇到问题的时候能够快速的找到方法

    如果能帮助跟我一样的新人是更好不过的了        如果有什么不正确或者可以改进的地方也希望大家能够指出来  谢谢大家

    1.委托

    来百度一下什么是委托:委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性。(百度百科)

    先来写个简单的委托:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace ConsoleApplication2
    {
        class Program
        {
            //声明没有参数,没有返回值的委托
            public delegate void MyDelegate();
            //委托对象
            static MyDelegate myDelegate;
    
            public static void Show()
            {
                Console.WriteLine("我的代理");
            }
    
            static void Main(string[] args)
            {
                myDelegate = new MyDelegate(Show);//实例化委托  委托myDelegate去做Show的事情
                myDelegate();//调用myDelegate
                Console.ReadKey();
            }
        }
    }
    

    将上面的改为带参数,带返回值的委托

    class Program
        {
            //声明带参数,带返回值的委托
            public delegate string MyDelegate(string data);
            //委托对象
            static MyDelegate myDelegate;
    
            public static string Show(string data)
            {
                return data;
            }
    
            static void Main(string[] args)
            {
                myDelegate = new MyDelegate(Show);//实例化委托  委托myDelegate去做Show的事情
                Console.WriteLine(myDelegate("委托的参数"));//在调用时,需要带上参数
                Console.ReadKey();
            }
        }
    

    现在我们写两个方法

     class Program
        {
            //声明带参数,带返回值的委托
            public delegate void MyDelegate();
            //委托对象
            static MyDelegate myDelegate;
    
            public static void ShowOne()
            {
                Console.WriteLine("委托一号");
            }
    
            public static void ShowTwo()
            {
                Console.WriteLine("委托二号");
            }
        }
    

    我们现在想输出两个中的一个  可以改成这样  顺便复习一下带参数的委托

    class Program
        {
            //声明带参数的委托
            public delegate void MyDelegate(string data);
            //委托对象
            static MyDelegate myDelegate;
    
            public static void Show(string data)
            {
                switch (data)
                {
                    case "委托一号":
                        Console.WriteLine("委托一号");
                        break;
                    case "委托二号":
                        Console.WriteLine("委托二号");
                        break;
                }
            }
    
            static void Main(string[] args)
            {
                myDelegate = new MyDelegate(Show);
                myDelegate("委托一号");//调用时的参数是什么就会输出对应的委托了
                Console.ReadKey();
            }
        }
    

     什么委托一号  什么委托二号 这个好记 要是选项多了  东西又不太好记怎么办  稍微改进一下

    /// <summary>
        /// 1是委托一号  2是委托二号
        /// </summary> 
       enum DATA
        {
            zero,
            NumOne,
            NumTwo,
        };
    
        class Program
        {
            //声明带参数的委托
            public delegate void MyDelegate(DATA data);
            //委托对象
            static MyDelegate myDelegate;
    
            public static void Show(DATA data)
            {
                switch (data)
                {
                    case DATA.NumOne:
                        Console.WriteLine("委托一号");
                        break;
                    case DATA.NumTwo:
                        Console.WriteLine("委托二号");
                        break;
                }
            }
    
            static void Main(string[] args)
            {
                myDelegate = new MyDelegate(Show);
                myDelegate(DATA.NumTwo);
                Console.ReadKey();
            }
        }
    

    是不是瞬间感觉高大上了     还有要活用/// <summary>    /// </summary>      这可是好东西 可以让别人用你代码的时候更加的清楚用的是什么有什么用处     可以提高代码的可读性哦

    2.事件

    如果我们希望两个方法同时输出该怎么做呢    应该这样:

     class Program
        {
            //声明带参数,带返回值的委托
            public delegate void MyDelegate();
            //委托对象
            static event MyDelegate myDelegate;//此处与上面不同哦
    
            public static void ShowOne()
            {
                Console.WriteLine("委托一号");
            }
    
            public static void ShowTwo()
            {
                Console.WriteLine("委托二号");
            }
    
            static void Main(string[] args)
            {
                myDelegate = new MyDelegate(ShowOne);//先给你对象赋上一个方法
                myDelegate += new MyDelegate(ShowTwo);//再给你加上一个方法
                myDelegate();//调用
                Console.ReadKey();
            }
        }
    

    看下输出  调用一个  两个同时都显示出来了  没错这就是事件(event)

    事件可以加 那能不能减呢   聪明  你没有猜错 当然可以  改完后看下结果

     static void Main(string[] args)
            {
                myDelegate = new MyDelegate(ShowOne);//先给你对象赋上一个方法
                myDelegate += new MyDelegate(ShowTwo);//再给你加上一个方法
                myDelegate();//调用
                Console.WriteLine("__________________________我来分割________________________");
                myDelegate -= new MyDelegate(ShowOne);
                myDelegate();//减完后再调一次
                Console.ReadKey();
            }
    

     

    3.匿名方法

    委托和事件说完了  来看看特别一点的    匿名方法

    在之前  每次实例化委托的时候都要有一个已经写好的方法  而匿名方法则不需要

        class Program
        {
            //声明带参数的委托
            public delegate void MyDelegate(string data);
            //委托对象
            static MyDelegate myDelegate;
    
            static void Main(string[] args)
            {
                myDelegate = delegate(string data)         //带参数
                {
                    Console.WriteLine(data);
                };
                myDelegate("带参数的匿名方法");
                Console.ReadKey();
            }
        }
    

     不带参数的只要将参数去掉即可       delegate后面跟上你需要用的参数在{}中进行你需要的操作  最后不要忘记带上分号哦

    4.Lambda表达式

    要是匿名方法还不够快  那试试这个

    class Program
        {
            //声明带参数的委托
            public delegate void MyDelegate(string data);
            //委托对象
            static MyDelegate myDelegate;
    
            static void Main(string[] args)
            {
                myDelegate = (string data) => { Console.WriteLine(data); };
                myDelegate("带参数Lambda表达式");
                Console.ReadKey();
            }
        }
    

     代码量是不是更少了呢  直接用小括号写上参数,然后是=> 再用个{}来框住你的操作  同样最后也有分号

    5.Action

    先来看看它的解释

    参数可以有好多也可以没有  但是  他没有返回值  来看看怎么用吧

    class Program
        {
            //不带参数的Action
            static Action actionOne;
            //带参数的Action
            static Action<string> actionTwo;
    
            static void Main(string[] args)
            {
                actionOne = new Action(ShowOne);
                actionOne();
    
                actionTwo = new Action<string>(ShowTwo);
                actionTwo("Action ShowTwo");
                Console.ReadKey();
            }
    
            static void ShowOne()
            {
                Console.WriteLine("Action ShowOne
    ");
            }
    
            static void ShowTwo(string data)
            {
                Console.WriteLine(data);
            }
        }
    

     试着输出一下吧

    6.Func

    它与Action类似  但是他是必须带返回值的

    前面的都是它的参数, 最后一个参数就是他的返回值

     //不带参数的Action
            static Func<string> FuncOne;
            //带参数的Action
            static Func<string,string> FuncTwo;
    
            static void Main(string[] args)
            {
                FuncOne = new Func<string>(ShowOne);
                Console.WriteLine(FuncOne());
    
                FuncTwo = new Func<string, string>(ShowTwo);
                Console.WriteLine(FuncTwo("Func ShowTwo"));
                Console.ReadKey();
            }
    
            static string ShowOne()
            {
                return "Func ShowOne
    ";
            }
    
            static string ShowTwo(string data)
            {
                return data;
            }
    

     大家试着自己输出吧  毕竟程序还是要多练的哦

  • 相关阅读:
    Python 学习---------Day2
    算法入门笔记------------Day2
    Python 学习---------Day1
    算法入门笔记------------Day1
    从零系列--开发npm包(一)
    webpack2.0+ vue2.0
    gulp + angular + requirejs 简单学习
    MAC node + git + bower 简单安装
    通过docker image repository 获取docker imges id 并删除
    docker 安装vim
  • 原文地址:https://www.cnblogs.com/OrangeZhang/p/delegate_2015112.html
Copyright © 2020-2023  润新知