.NET-16-委托|匿名方法和Lambda表达式|泛型委托

委托

委托是一种数据类型

委托可以把方法当做参数传递

class Program
    {
        static void Main(string[] args)
        {
            #region   无参数无返回值得委托使用
            //委托是一种数据类型,像类一样
            //类的定义用class,委托的定义用delegate
            //委托的意义就是把变化的代码给封装起来,在使用的时候动态的传递使用

            //类的使用直接new个对象
            Person p = new Person();
            //委托的使用也是直接创建对象,把对应的无返回值无参数的方法M1当做入参传入
            //2.委托使用第二部,创建委托的对象
            M1Delegate md = new M1Delegate(M1);
            //3.委托使用第三部,调用委托的时候就相当于调用发委托保存的对象
            //简写为
            md();
            //全写为
            md.Invoke();
            Console.ReadKey();

            //类可以有字段属性方法等
            //委托是用来存储方法的
            #endregion   无参数无返回值得委托使用


        }


        /// <summary>
        /// 定义一个无参数无返回值得方法
        /// 用来传入委托
        /// </summary>
        static void M1()
        {
            Console.WriteLine("我是一个无参数无返回值的方法M1");
        }
    }

    /// <summary>
    /// 定义一个类
    /// </summary>
    public class Person
    {
        private string _name;

        public string Name
        {
            get { return _name; }
            set { _name = value; }
        }
    }


    /// <summary>
    /// 在定义委托的时候
    /// 要明确该委托是否有返回值,入参列表(入参的数量,参数的类型)
    ///
    /// 定义一个委托,该委托无返回值,无参数
    /// 1.委托使用第一步,定义委托
    /// </summary>
    /// <param name="?"></param>
    /// <returns></returns>
    public delegate void M1Delegate();

例如,有一个方法ChangeStrings(string[] strs);在这个方法里面需要对传入的字符串数组进行操作,然后输出改变之后的字符串数组

但是现在有不同的需求,1.在每个字符串两边增加"☆"

2.把字符串中所有的英文转换成大写

在使用为拖实现的时候可以定义两个方法,一个用来增加"☆",一个用来转换成大写字母

定义一个委托,根据不同的需求传入不同的方法来执行字符串的修改

如些截图,先定义一个委托,然后对方法ChangeStrings做如下修改

调用方法ChangeStrings方式如下

class Program
    {
        static void Main(string[] args)
        {
            #region   无参数无返回值得委托使用
            ////委托是一种数据类型,像类一样
            ////类的定义用class,委托的定义用delegate
            ////委托的意义就是把变化的代码给封装起来,在使用的时候动态的传递使用

            ////类的使用直接new个对象
            //Person p = new Person();
            ////委托的使用也是直接创建对象,把对应的无返回值无参数的方法M1当做入参传入
            ////2.委托使用第二部,创建委托的对象
            //M1Delegate md = new M1Delegate(M1);
            ////3.委托使用第三部,调用委托的时候就相当于调用发委托保存的对象
            ////简写为
            //md();
            ////全写为
            //md.Invoke();
            //Console.ReadKey();

            ////类可以有字段属性方法等
            ////委托是用来存储方法的
            #endregion   无参数无返回值得委托使用

            #region    使用委托隐藏邮箱

            ////隐藏邮箱,邮箱名称有几位替换成几个*
            ////这里是直接全部替换成了3个*,想要几个字符替换成几个*需要穿委托参数
            //string str = "邮箱[email protected],邮箱[email protected],邮箱[email protected]";
            ////禁止匹配汉字
            ////str = Regex.Replace(str, @"\w+(@\w+.\w+)", "***$1", RegexOptions.ECMAScript);
            ////使用委托,邮箱名称有多长就用几个*替换
            //str = Regex.Replace(str, @"(\w+)(@\w+.\w+)", Repl, RegexOptions.ECMAScript);
            //Console.WriteLine(str);
            //Console.ReadKey();
            #endregion   使用委托隐藏邮箱

            #region    匿名方法
            //如果一个方法只使用一次,之后就不在使用
            //如下定义了三个委托:无参数无返回值,有参数无返回值,有参数有返回值
            ////匿名方法不是直接定义的,而是在给委托赋值的时候,直接定义一个没有名称的方法,只有方法体
            ////正常使用的方式是这样的
            //M1Delegate md1 = new M1Delegate(M1);
            ////或者
            //M1Delegate md2 = M1;

            ////匿名方法使用的凡是如下,使用关键字delegate()来定义匿名函数
            //M1Delegate md = delegate()
            //{
            //    Console.WriteLine("这里是一个无参数无返回值得匿名方法");
            //};
            //md();


            ////有参数无返回值的匿名方法
            //M2Delegate m2d = delegate(string str)
            //{
            //    Console.WriteLine("{0},早上好", str);
            //};
            //m2d("小硕硕");


            ////有参数有返回值的匿名方法
            //M3Delegate m3d = delegate(int n1, int n2)
            //{
            //    return n1 + n2;
            //};
            //int result = m3d(10, 13);
            //Console.WriteLine(result);

            //Console.ReadKey();
            #endregion    匿名方法


            #region   lambda表达式代替匿名方法
            ////无参数无返回值
            //M1Delegate m1d = () => { Console.WriteLine("Lambda表达式"); };
            //m1d();


            ////有参数无返回值
            ////可以简写为
            //M2Delegate m2d = m => { Console.WriteLine("{0},hahahhaha", m); };
            //m2d("你好");
            ////或者规范的写为
            //M2Delegate m2d1 = (m) => { Console.WriteLine("{0},hahahhaha", m); };
            //m2d1("你好");


            ////有参数有返回值
            ////lambda表达式是不需要传递参类型的,应为委托已经限定了参数的类型
            //M3Delegate m3d = (n1, n2) =>
            //{
            //    Console.WriteLine("Lambda表达式不需要传递参数类型");
            //    return n1 + n2;
            //};
            //int result = m3d(10, 20);
            //Console.WriteLine(result);


            ////可变参数
            //M4Delegate m4d = (arr) =>
            //{
            //    return arr.Sum();
            //};
            //int r = m4d(1, 2, 34, 5, 6, 7);
            //Console.WriteLine(r);

            //Console.ReadKey();

            #endregion   lambda表达式代替匿名方法

            #region    泛型委托
            //系统已经封装好了一些委托,在日常使用中已经足够使用
            //Action:无参数无返回值的委托
            //Action泛型:有参数没有返回值的泛型委托,有16个重载,最多可以传递16个泛型参数
            //Func:没有非泛型版本的,只有一个泛型版本的,一共有17个重载,每个重载都有返回值,但是入参从0个入参到16个泛型入参

            //无参数无返回值委托
            Action acti = new Action(M1);
            acti();

            //有参数无返回值得泛型委托
            Action<string> aa = (m) => { Console.WriteLine(m); };
            aa("你好啊");


            //有返回值得泛型委托
            Func<int, int, int> fun = new Func<int, int, int>(M3);
            int r = fun(10, 20);
            Console.WriteLine(r);

            Console.ReadKey();
            #endregion   泛型委托
        }


        /// <summary>
        /// 用来操作邮箱匹配的规则
        /// </summary>
        /// <param name="mat"></param>
        /// <returns></returns>
        static string Repl(Match mat)
        {
            string uid = mat.Groups[1].Value;
            string othere = mat.Groups[2].Value;
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < uid.Length; i++)
            {
                sb.Append("*");
            }

            return sb.ToString() + othere;
        }


        /// <summary>
        /// 定义一个无参数无返回值得方法
        /// 用来传入委托
        /// </summary>
        static void M1()
        {
            Console.WriteLine("我是一个无参数无返回值的方法M1");
        }


        static void M2(string str)
        {
            Console.WriteLine(str);
        }


        static int M3(int n1, int n2)
        {
            return n1 + n2;
        }
    }


    /// <summary>
    /// 在定义委托的时候
    /// 要明确该委托是否有返回值,入参列表(入参的数量,参数的类型)
    ///
    /// 定义一个委托,该委托无返回值,无参数
    /// 1.委托使用第一步,定义委托
    /// </summary>
    /// <param name="?"></param>
    /// <returns></returns>
    public delegate void M1Delegate();


    /// <summary>
    /// 有参数无返回值的委托
    /// </summary>
    /// <param name="str"></param>
    public delegate void M2Delegate(string str);


    /// <summary>
    /// 有参数有返回值得委托
    /// </summary>
    /// <param name="n1"></param>
    /// <param name="n2"></param>
    /// <returns></returns>
    public delegate int M3Delegate(int n1, int n2);


    /// <summary>
    /// 可变参数
    /// </summary>
    /// <param name="?"></param>
    /// <returns></returns>
    public delegate int M4Delegate(params int[] arr);

猜你喜欢

转载自blog.csdn.net/m0_37532448/article/details/81266398