委托、泛型委托、多播委托 和 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]+"\"";
            }
        }

    }

}
 

解析:

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);
        }
    }
}

使用委托简化:

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]+"\"";
        //    }
        //}

    }

}
 

使用匿名函数再简化:

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+"\"";
        //}

    }

}
 

时间: 2024-10-19 23:44:57

委托、泛型委托、多播委托 和 lamda表达式的相关文章

Net中委托之二多播委托

本篇主要讲解多播委托 1.多播委托的实例 public class MyDelegate { private delegate int NoParameterWithReturn();//1.声明委托 public static void Show() { NoParameterWithReturn method = new NoParameterWithReturn(ShowSomething);//2.委托的实例化 //多播委托 method += ShowSomething;//按顺序添加

委托Delegate,多播委托和委托链

定义一个委托 public delegate void CalculateDelegate(int 32 x,int 32 y); 定义一个委托类型的变量 public static CalculateDelegate mydelegate; 定义一个方法和委托绑定,注意定义的方法和委托的参数要统一 public static void Add(int 32 x,int 32 y) { console.writeline(x+y); } 将方法和委托绑定 public static void m

委托、Lambda表达式、事件系列04,委托链是怎样形成的, 多播委托

在"委托.Lambda表达式.事件系列01,委托是什么,委托的基本用法,委托的Method和Target属性"中,反编译委托,发现委托都是多播委托. 既然委托是多播委托,我们可以通过"+="把多个方法赋给委托变量,这样就形成了一个委托链, 它是怎样形成的?来看下面的例子: namespace ConsoleApplication3 { internal delegate void MySayDel(string msg); class Program { stati

C#多播委托

概述 在上一篇文章中,笔者就个人理解的委托做了简单的分享,本篇文章主要来说说多播委托.多播委托即每个委托可以包含多个方法. 理解多播委托 多播委托可以保护多个方法,但是在使用的时候需要注意:委托的签名必须是返回void,否则只能调用最后一个方法的得到结果.多播委托派生自System.MulticastDelegate类,System.MulticastDelegate类又派生自System.Delegate.System.MulticastDelegate的其他成员可以允许把多个方法调用链接为一

从多播委托到事件

一.多播委托 前文提到的委托只是在一个委托类型中存储了一个方法(函数),实际上一个委托变量可以同时绑定多个方法,这些委托形成了一个委托链,每一个委托(实际上是方法)都顺序指向下一个委托,这个委托链就是多播委托. 每一个绑定的方法就像是订阅者一样,等着发布者的消息,而触发委托变量的那个就像是发布者,将出发的信号传给所有的订阅者. 1.订阅者 考虑一个温度控制器的例子,这个控制器拥有两个调温器,一个加热器,当温度低于指定的值时,启动,一个冷却器,当温度高于指定的温度时,启动.二者的类设计如下: 1

[.net 面向对象程序设计进阶] (5) Lamda表达式(一) 创建委托

[.net 面向对象程序设计进阶] (5) Lamda表达式(一)  创建委托 本节导读: 通过学习Lambda表达式,学会创建委托和表达式目录树,深入了解Lambda的特性,让你的代码变的更加清晰.简洁.高效. 读前必备: 本节学习前,需要掌握以下知识: A.泛型        (请参考[.net 面向对象编程基础]  (18) 泛型) B.Linq基础 (请参照[.net 面向对象编程基础] (19) LINQ基础) C.Linq使用  (请参照[.net 面向对象编程基础]  (20) L

C#中委托,匿名函数,lamda表达式复习

一.委托 1.就给类比较,类用class声明,委托用delegate声明. 2.委托要指向一个真正的方法. 3.委托的签名,要和指向的方法一样. //1.声明一个委托 public delegate void DelSayHi(string name); public static void SayHiChinese(string name) { Console.WriteLine("你好?" + name); } public static void SayHiEnglish(str

多播委托和匿名方法再加上Lambda表达式

多播委托就是好几个方法全都委托给一个委托变量 代码: 1 namespace 委托 2 { 3 class Program 4 { 5 static void math1() 6 { 7 Console.WriteLine("这是第一个方法"); 8 } 9 10 static void math2() 11 { 12 Console.WriteLine("这是第二个方法"); 13 } 14 15 static void Main(string[] args) 1

委托、Lambda表达式、事件系列03,从委托到Lamda表达式

在"委托.Lambda表达式.事件系列02,什么时候该用委托"一文中,使用委托让代码简洁了不少. namespace ConsoleApplication2 { internal delegate bool MyCalculateDelegate(int val); class Program { static void Main(string[] args) { IEnumerable<int> source = new List<int>(){2, 3, 4