委托泛型委托多播委托 和 lamda表达式

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了委托泛型委托多播委托 和 lamda表达式相关的知识,希望对你有一定的参考价值。

委托基本概念:可以把一个方法作为一个参数传给另一个方法

声明:  方法前加 delegate  关键字

 

列子:

技术分享
using System;
using System.Collections;
using System.Collections.Generic;
namespace Dome
{
    class dom
    {
        static void Main(string[] args)
        {
            string[] sname = { "Abc", "dFg", "HjK" };
            toUpper(sname);

            for (int i = 0; i < sname.Length;i++ )
            {
                Console.WriteLine(sname[i]);
            }
            Console.ReadKey();
        }
      
        //现在有三个需求
        //将字符串数组中的每个元素转换成大写;
        //将字符串数组中的每个元素转换成小写;
        //将字符串数组中的每个元素都添加上一个双引号;
        public static void toUpper(string[] names) {
            for (int i = 0; i <names.Length ;i++ )
            {
                names[i] = names[i].ToUpper();
            }
        }

        //xiaoxie
        public static void toxiao(string[] names) {
            for (int i = 0; i < names.Length;i++ ) {
                names[i] = names[i].ToLower();
            }
        }

        //添加双引号
        public static void toshuang(string[] names) {
            for (int i = 0; i < names.Length; i++)
            {
                names[i] = "\""+names[i]+"\"";
            }
        }

    }
   
}
 
View Code

解析:

技术分享
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace cs
{
    public delegate void delsayhi(string name);//放在类外面
    class t
    {
        static void Main(string[] args)
        {
            //声明一个委托,必须要跟传递的方法具有相同的  签名(返回值和参数)
            //创建委托对象
            //函数可以赋值给一个委托
            delsayhi del = wsayhi; //new delsayhi(wsayhi);
            del("张三");

            test("张张",sayhi);
            //匿名函数 没有名字的函数
            test("李四", delegate(string name) { Console.WriteLine("hello"+name); });
           //lamda表达式  => goes to
            test("王五", (string name) => { Console.WriteLine("hello" + name); });
            Console.ReadKey();
        }
        public static void test(string name, delsayhi del) {
            del(name);
        }


        public static void sayhi(string name)
        {
            Console.WriteLine("你好" + name);
        }

        public static void wsayhi(string name)
        {
            Console.WriteLine("hello" + name);
        }
    }
}
View Code

使用委托简化:

技术分享
using System;
using System.Collections;
using System.Collections.Generic;
namespace Dome
{
    public delegate string delpro(string str);
    class dom
    {
        static void Main(string[] args)
        {
            string[] sname = { "Abc", "dFg", "HjK" };
            //toUpper(sname);
            test(sname, p3);
            for (int i = 0; i < sname.Length;i++ )
            {
                Console.WriteLine(sname[i]);
            }
         
            Console.ReadKey();
        }

        public static void test(string[] names,delpro del) {

            for (int i = 0; i < names.Length;i++ ) {
                names[i] = del(names[i]);
            }
        }
        public static string p1(string str) {
            return str.ToUpper();
        }
        public static string p2(string str) {
            return str.ToLower();
        }
        public static string p3(string str) { 
        return "\""+str+"\"";
        }
        //现在有三个需求
        //将字符串数组中的每个元素转换成大写;
        //将字符串数组中的每个元素转换成小写;
        //将字符串数组中的每个元素都添加上一个双引号;
        //public static void toUpper(string[] names) {
        //    for (int i = 0; i <names.Length ;i++ )
        //    {
        //        names[i] = names[i].ToUpper();
        //    }
        //}

        ////xiaoxie
        //public static void toxiao(string[] names) {
        //    for (int i = 0; i < names.Length;i++ ) {
        //        names[i] = names[i].ToLower();
        //    }
        //}

        ////添加双引号
        //public static void toshuang(string[] names) {
        //    for (int i = 0; i < names.Length; i++)
        //    {
        //        names[i] = "\""+names[i]+"\"";
        //    }
        //}

    }
   
}
 
View Code

使用匿名函数再简化:

技术分享
using System;
using System.Collections;
using System.Collections.Generic;
namespace Dome
{
    public delegate string delpro(string str);
    class dom
    {
        static void Main(string[] args)
        {
            string[] sname = { "Abc", "dFg", "HjK" };
            //toUpper(sname);
           // test(sname, p3);
            //使用匿名函数简化;
            test(sname, delegate(string name) { return name.ToUpper(); });
          //lamda表达式
            test(sname, (string str) => { return str.ToLower(); });
            
            for (int i = 0; i < sname.Length;i++ )
            {
                Console.WriteLine(sname[i]);
            }
         
            Console.ReadKey();
        }

        public static void test(string[] names,delpro del) {

            for (int i = 0; i < names.Length;i++ ) {
                names[i] = del(names[i]);
            }
        }
        //public static string p1(string str) {
        //    return str.ToUpper();
        //}
        //public static string p2(string str) {
        //    return str.ToLower();
        //}
        //public static string p3(string str) { 
        //return "\""+str+"\"";
        //}
       
    }
   
}
 
View Code

 

以上是关于委托泛型委托多播委托 和 lamda表达式的主要内容,如果未能解决你的问题,请参考以下文章

(23)c#传智:单例模式,XML读写,委托,匿名函数,Lamda,多播委托

委托应用及泛型委托和多播委托

C#学习(10):委托

按自己的想法去理解事件和泛型(C#)

C#委托,匿名方法,Lambda,泛型委托,表达式树代码示例

委托和事件