四个代码让你明白委托,匿名函数,Lamda表达式

时间:2022-04-29 19:14:00
先来一个你看不懂的代码:
namespace Delegate
{
 class 最终
    {
        public delegate string DelNames(string name);
        static void Main(string[] args)
        {
            string[] names = { "wUangWU", "ZhangSan", "LISI" };
            OperatorStr(names,(string name) => { name = name.ToUpper();return name; });
            Console.ReadKey();
        }
        public static void OperatorStr(string[] names, DelNames dns)
        {
            for (int i = 0; i < names.Length; i++)
               Console.WriteLine(dns(names[i]));
        }
    }
}

我相信对于没有这方面基础或刚学的人来说很难看懂,没关系,请看下面这个代码你一定看的懂

class 开始
    {
        static void Main(string[] args)
        {
            string[] names = { "wUangWU", "ZhangSan", "LISI" };
            ToUpperStr(names);
            //ToLowerStr(names);
            for (int i = 0; i < names.Length; i++)
                Console.WriteLine(names[i]);
            Console.ReadKey();
        }

        public static void ToUpperStr(string[] names)
        {
            for (int i = 0; i < names.Length; i++)
                names[i] = names[i].ToUpper();
        }
        public static void ToLowerStr(string[] names)
        {
            for (int i = 0; i < names.Length; i++)
                names[i] = names[i].ToLower();
        }
    }
}
这是中规中矩的代码,将字符串的大小写转换,再看下三个代码:
 
 class 委托的使用
    {
        public delegate void DelNames(string[] name);
        static void Main(string[] args)
        {
            string[] names = { "wUangWU", "ZhangSan", "LISI" };
            DelNames dns = new DelNames(ToUpperStr);
            DelNames dns1 = new DelNames(ToLowerStr);
            dns(names);
            dns1(names);
            for (int i = 0; i < names.Length; i++)
                Console.WriteLine(names[i]);
            Console.ReadKey();
        }

        public static void ToUpperStr(string[] names)
        {
            for (int i = 0; i < names.Length; i++)
                names[i] = names[i].ToUpper();
        }
        public static void ToLowerStr(string[] names)
        {
            for (int i = 0; i < names.Length; i++)
                names[i] = names[i].ToLower();
        }
    }

使用了委托
 
 
class 委托的简化V_3
    {
        public delegate string DelNames(string name);
        static void Main(string[] args)
        {
            string[] names = { "wUangWU", "ZhangSan", "LISI" };
            //DelNames dns = ToUpperStr;
            //对这一步的简化
            OperatorStr(names, delegate(string name)
            //加上string的原因是要指明函数的类型,使用的是那种类型的委托
            {
                name = name.ToUpper();
                return name;
            });
            //对这步骤的简化,在编译的时候自动new dns的实例化
            for (int i = 0; i < names.Length; i++)
                Console.WriteLine(names[i]);
            Console.ReadKey();
        }
        public static void OperatorStr(string[] names, DelNames dns)
        {
            for (int i = 0; i < names.Length; i++)
                //对这一步骤的简化,抽象出共同代码部分,实现函数作为参数
                names[i] = dns(names[i]);
        }
        //使用匿名函数减少代码量,只使用一次的时候,使用匿名函数    
    }
    class 委托的简化V_4
    {
        public delegate string DelNames(string name);
        static void Main(string[] args)
        {
            string[] names = { "wUangWU", "ZhangSan", "LISI" };
            // DelNames dns =(string name)=>
            //{
            //     name = name.ToUpper();
            //     return name;
            //  };
            //对这一步的简化(Lamda表达式和匿名函数的使用)
            OperatorStr(names, (string name) => { name = name.ToUpper(); return name; });
            Console.ReadKey();
        }
        public static void OperatorStr(string[] names, DelNames dns)
        {
            for (int i = 0; i < names.Length; i++)
                //对这一步骤的简化,抽象出共同代码部分,实现函数作为参数
                Console.WriteLine(dns(names[i]));
        }
        //使用匿名函数减少代码量,只使用一次的时候,使用匿名函数    
    }

我相信看到这里你应该懂了,快点动手试试