【一文了解】C#重点-委托2

目录

1.重点知识回顾

1.1委托的定义

1.2委托的3个基本使用步骤

1.3单播委托与多播委托

实例化委托的4种方法

方法1、2

方法3:匿名方法

方法4:Lambda表达式

Lambda表达式

基本语法

基本使用

无参数的Lambda表达式

单个参数的Lambda表达式

多个参数的Lambda表达式

带有语句块的Lambda表达式

Lambda与LINQ结合使用

实战演练:使用四种方法实例化委托

1.public delegate void Handler(); 

2.public delegate int Handler(int a);

3.public delegate int Handler(int a,int b);

4.public int Handler(Person p);//从一个对象中得到int类型的属性,如id属性


       本篇文章来进一步学习一下C#的委托,主要来详细学习一下实例化委托的4中方法。

1.重点知识回顾

       在【一文了解】C#重点-委托1中已经学习了委托的定义、委托的3个基本使用步骤、单播委托和多播委托等,先来回顾一下重点:

1.1委托的定义

       委托是一种数据类型(关键字delegate);委托代表的是方法;当调用委托时就是调用了这个方法。

1.2委托的3个基本使用步骤

1)定义委托

       在定义端定义委托,定义格式为delegate 返回类型 委托类型名(形参列表);

delegate void Handler();

2)创建实例

       在调用端创建实例,即实例化委托,为委托指定/绑定方法

delegate void Handler();

3)调用委托

       在调用端调用委托,调用委托和调方法相似,有参数就要写参数,有返回值就可以返回

handler();

1.3单播委托与多播委托

       委托有返回值不适合多播执行,委托无返回值适合多播执行。

       接下来重点学习实例化委托的写法。

实例化委托的4种方法

方法1、2

       基本传统标准的写法,适合于委托已有的方法

Handler handler = new Handler(Fun);
Handler handler = Fun; //简化的写法:等号右边表示的是委托对象

方法3:匿名方法

       适合于功能简单,少量代码可以完成的方法,且该功能不需要在其它地方复用

Handler handler = delegate(int a) //等号右边表示的是委托对象=匿名方法
{
      for (int i = 0; i < a; i++)
      Console.WriteLine("HAHA");
};

方法4:Lambda表达式

       适合于功能简单,少量代码可以完成的方法,且该功能不需要在其它地方复用

       使用格式:委托类型 委托对象名=Lambda 表达式;

//等号右边表示的是委托对象=匿名方法=Lambda 表达式
Handler handler = (p) => Console.WriteLine(p + "Hello");

Lambda表达式

       Lambda表达式是 C# 中的一种简洁的匿名方法(函数),它可以被用来创建内联的委托或表达式树。Lambda表达式通常用于 LINQ 查询、事件处理、回调函数等场景。它提供了一种更加简洁和表达式化的方式来编写方法或代码块。

基本语法

       Lambda表达式的基本语法如下

(parameters) => expression

parameters:一个或多个参数,表示 lambda 表达式的输入参数。如果没有参数,则使用空括号 ();如果只有一个参数,可以省略括号。

=>:这个符号称为“lambda 操作符”,用于分隔输入参数和表达式的主体部分。

expression:lambda 表达式的主体部分,它可以是一个表达式、语句块或返回值。

基本使用
无参数的Lambda表达式
Action greet = () => Console.WriteLine("Hello, world!");
greet();//输出:Hello, world!

该 Action 委托不接受任何参数,并且执行 Console.WriteLine 方法。

单个参数的Lambda表达式
Func<int, int> square = x => x * x;
Console.WriteLine(square(5));//输出:25

该 Func<int, int> 委托接受一个 int 类型的参数 x,并返回 x 的平方。其中第一个int是int类型的参数,第二个int是类型为int的返回值

多个参数的Lambda表达式
Func<int, int, int> add = (a, b) => a + b;
Console.WriteLine(add(3, 4));//输出:7

该 Func<int, int, int> 委托接受两个 int 类型的参数 a 和 b,并返回它们的和。

带有语句块的Lambda表达式
Action<int, int> printSum = (a, b) =>
{
    int sum = a + b;
    Console.WriteLine("Sum: " + sum);
};
printSum(3, 4);//输出:Sum: 7

该 lambda 表达式使用了一个语句块(用花括号包围),而不是单个表达式。

Lambda与LINQ结合使用

Lambda表达式在 LINQ 查询中非常常见,用来表示查询操作中的过滤、排序等操作:

List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };
var evenNumbers = numbers.Where(n => n % 2 == 0).ToList();
foreach (var num in evenNumbers)
{
    Console.WriteLine(num);//输出:2 4
}

其中 Where 方法接受一个 lambda 表达式 n => n % 2 == 0,用于过滤出偶数。

实战演练:使用四种方法实例化委托

1.public delegate void Handler(); 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DelegatePro
{
    //调用端
    class DelegateInstantiation1
    {
        static void Main(string[] args)
        {
            //②实例化委托
            //写法1,2 要先定义好(绑定好)方法
            //Handler handler = new Handler(Fun);//写法1
            //Handler handler = Fun;//写法2 Fun为委托对象

            //写法3,4 不需要先定义好(绑定好)方法
            //写法3 匿名方法
            //Handler handler = delegate ()
            //{
            //    Console.WriteLine("写法3");
            //};
            //写法4 Lambda表达式
            Handler handler = ()=>
            { 
                Console.WriteLine("写法4"); 
            };

            //③调用委托
            handler();
        }

        static void Fun()
        {
            Console.WriteLine("调用Fun");
        }
    }

    //定义端
    //①定义委托
    public delegate void Handler();
}

2.public delegate int Handler(int a);

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DelegatePro
{
    //调用端
    class DelegateInstantiation2
    {
        static void Main(string[] args)
        {
            //②实例化委托
            //方法1,2 要先定义好(绑定好)方法
            //Handler handler = new Handler(Fun);//写法1
            //Handler handler = Fun;//写法2 Fun为委托对象

            //方法3,4 不需要先定义好(绑定好)方法
            //方法3 匿名方法
            //Handler handler = delegate (int a)
            //{
            //    return a * a;
            //};
            //方法4 Lambda表达式
            //写法1
            //Handler handler = (int a) =>
            //{
            //    return a * a;
            //};
            //写法1的简化
            //Handler handler = (a) =>
            //{
            //    return a * a;
            //};
            //写法2
            Handler handler = a => a * a;

            //③调用委托
            int res = handler(3);
        }

        static int Fun(int a)
        {
            return a * a;   
        }
    }

    //定义端
    //①定义委托 和定义好的方法的返回值类型,形参列表要对应
    public delegate int Handler(int a);
}

3.public delegate int Handler(int a,int b);

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DelegatePro
{
    //调用端
    class DelegateInstantiation3
    {
        static void Main(string[] args)
        {
            //②实例化委托
            //方法1,2 要先定义好(绑定好)方法
            //Handler handler = new Handler(Add);//写法1
            //Handler handler = Add;//写法2 Add为委托对象

            //方法3,4 不需要先定义好(绑定好)方法
            //方法3 匿名方法
            //Handler handler = delegate (int a,int b)
            //{
            //    return a + b;
            //};
            //方法4 Lambda表达式
            //写法1
            //Handler handler = (int a,int b) =>
            //{
            //    return a + b;
            //};
            //写法1的简化
            //Handler handler = (a, b) =>
            //{
            //    return a + b;
            //};
            //写法2
            Handler handler = (int a, int b) => a + b;

            //③调用委托
            int res = handler(1,2);
        }

        static int Add(int a,int b)
        {
            return a + b;
        }
    }

    //定义端
    //①定义委托 和定义好的方法的返回值类型,形参列表要对应
    public delegate int Handler(int a, int b);
}

4.public int Handler(Person p);//从一个对象中得到int类型的属性,如id属性

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DelegatePro
{
    //调用端
    class DelegateInstantiation3
    {
        static void Main(string[] args)
        {
            //②实例化委托
            //方法1,2 要先定义好(绑定好)方法
            Person person = new Person
            {
                id = 1001,
                name = "张三",
                age = 23
            };
            //Handler handler = new Handler(GetIdOfPerson);//写法1
            //Handler handler = GetIdOfPerson;//写法2 GetIdOfPerson为委托对象

            //方法3,4 不需要先定义好(绑定好)方法
            //方法3 匿名方法
            //Handler handler = delegate (Person p)
            //{
            //    return p.id;
            //};
            //方法4 Lambda表达式
            //写法1
            //Handler handler = (Person p) =>
            //{
            //    return p.id;
            //};
            //写法1的简化
            //Handler handler = (p) =>
            //{
            //    return p.id;
            //};
            //写法2
            Handler handler = p => p.id;

            //③调用委托
            int res = handler(person);
        }

        static int GetIdOfPerson(Person p)
        {
            return p.id;
        }
    }

    //定义端
    //①定义委托 和定义好的方法的返回值类型,形参列表要对应
    public delegate int Handler(Person p);
    public class Person
    {
        public int id;
        public string name;
        public int age;
    }
}

       好了,本次的分享到这里就结束啦,希望对你有所帮助,可以多看几遍加深理解~

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值