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

打印 上一主题 下一主题

主题 1740|帖子 1740|积分 5220

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
目录
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 返回范例 委托范例名(形参列表);

  1. delegate void Handler();
复制代码
2)创建实例

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

  1. delegate void Handler();
复制代码
3)调用委托

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

  1. handler();
复制代码

1.3单播委托与多播委托

       委托有返回值不得当多播实行,委托无返回值得当多播实行。


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

实例化委托的4种方法

方法1、2

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

  1. Handler handler = new Handler(Fun);
  2. Handler handler = Fun; //简化的写法:等号右边表示的是委托对象
复制代码

方法3:匿名方法

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

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

方法4:Lambda表达式

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

       使用格式:委托范例 委托对象名=Lambda 表达式;

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

Lambda表达式

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


基本语法

       Lambda表达式的基本语法如下

  1. (parameters) => expression
复制代码
parameters:一个或多个参数,表现 lambda 表达式的输入参数。假如没有参数,则使用空括号 ();假如只有一个参数,可以省略括号。

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

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


基本使用

无参数的Lambda表达式

  1. Action greet = () => Console.WriteLine("Hello, world!");
  2. greet();//输出:Hello, world!
复制代码
该 Action 委托不接受任何参数,并且实行 Console.WriteLine 方法。


单个参数的Lambda表达式

  1. Func<int, int> square = x => x * x;
  2. Console.WriteLine(square(5));//输出:25
复制代码
该 Func<int, int> 委托接受一个 int 范例的参数 x,并返回 x 的平方。其中第一个int是int范例的参数,第二个int是范例为int的返回值


多个参数的Lambda表达式

  1. Func<int, int, int> add = (a, b) => a + b;
  2. Console.WriteLine(add(3, 4));//输出:7
复制代码
该 Func<int, int, int> 委托接受两个 int 范例的参数 a 和 b,并返回它们的和。


带有语句块的Lambda表达式

  1. Action<int, int> printSum = (a, b) =>
  2. {
  3.     int sum = a + b;
  4.     Console.WriteLine("Sum: " + sum);
  5. };
  6. printSum(3, 4);//输出:Sum: 7
复制代码
该 lambda 表达式使用了一个语句块(用花括号困绕),而不是单个表达式。


Lambda与LINQ结合使用

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

  1. List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };
  2. var evenNumbers = numbers.Where(n => n % 2 == 0).ToList();
  3. foreach (var num in evenNumbers)
  4. {
  5.     Console.WriteLine(num);//输出:2 4
  6. }
复制代码
其中 Where 方法接受一个 lambda 表达式 n => n % 2 == 0,用于过滤出偶数。


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

1.public delegate void Handler(); 

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. namespace DelegatePro
  7. {
  8.     //调用端
  9.     class DelegateInstantiation1
  10.     {
  11.         static void Main(string[] args)
  12.         {
  13.             //②实例化委托
  14.             //写法1,2 要先定义好(绑定好)方法
  15.             //Handler handler = new Handler(Fun);//写法1
  16.             //Handler handler = Fun;//写法2 Fun为委托对象
  17.             //写法3,4 不需要先定义好(绑定好)方法
  18.             //写法3 匿名方法
  19.             //Handler handler = delegate ()
  20.             //{
  21.             //    Console.WriteLine("写法3");
  22.             //};
  23.             //写法4 Lambda表达式
  24.             Handler handler = ()=>
  25.             {
  26.                 Console.WriteLine("写法4");
  27.             };
  28.             //③调用委托
  29.             handler();
  30.         }
  31.         static void Fun()
  32.         {
  33.             Console.WriteLine("调用Fun");
  34.         }
  35.     }
  36.     //定义端
  37.     //①定义委托
  38.     public delegate void Handler();
  39. }
复制代码
2.public delegate int Handler(int a);

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. namespace DelegatePro
  7. {
  8.     //调用端
  9.     class DelegateInstantiation2
  10.     {
  11.         static void Main(string[] args)
  12.         {
  13.             //②实例化委托
  14.             //方法1,2 要先定义好(绑定好)方法
  15.             //Handler handler = new Handler(Fun);//写法1
  16.             //Handler handler = Fun;//写法2 Fun为委托对象
  17.             //方法3,4 不需要先定义好(绑定好)方法
  18.             //方法3 匿名方法
  19.             //Handler handler = delegate (int a)
  20.             //{
  21.             //    return a * a;
  22.             //};
  23.             //方法4 Lambda表达式
  24.             //写法1
  25.             //Handler handler = (int a) =>
  26.             //{
  27.             //    return a * a;
  28.             //};
  29.             //写法1的简化
  30.             //Handler handler = (a) =>
  31.             //{
  32.             //    return a * a;
  33.             //};
  34.             //写法2
  35.             Handler handler = a => a * a;
  36.             //③调用委托
  37.             int res = handler(3);
  38.         }
  39.         static int Fun(int a)
  40.         {
  41.             return a * a;   
  42.         }
  43.     }
  44.     //定义端
  45.     //①定义委托 和定义好的方法的返回值类型,形参列表要对应
  46.     public delegate int Handler(int a);
  47. }
复制代码
3.public delegate int Handler(int a,int b);

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. namespace DelegatePro
  7. {
  8.     //调用端
  9.     class DelegateInstantiation3
  10.     {
  11.         static void Main(string[] args)
  12.         {
  13.             //②实例化委托
  14.             //方法1,2 要先定义好(绑定好)方法
  15.             //Handler handler = new Handler(Add);//写法1
  16.             //Handler handler = Add;//写法2 Add为委托对象
  17.             //方法3,4 不需要先定义好(绑定好)方法
  18.             //方法3 匿名方法
  19.             //Handler handler = delegate (int a,int b)
  20.             //{
  21.             //    return a + b;
  22.             //};
  23.             //方法4 Lambda表达式
  24.             //写法1
  25.             //Handler handler = (int a,int b) =>
  26.             //{
  27.             //    return a + b;
  28.             //};
  29.             //写法1的简化
  30.             //Handler handler = (a, b) =>
  31.             //{
  32.             //    return a + b;
  33.             //};
  34.             //写法2
  35.             Handler handler = (int a, int b) => a + b;
  36.             //③调用委托
  37.             int res = handler(1,2);
  38.         }
  39.         static int Add(int a,int b)
  40.         {
  41.             return a + b;
  42.         }
  43.     }
  44.     //定义端
  45.     //①定义委托 和定义好的方法的返回值类型,形参列表要对应
  46.     public delegate int Handler(int a, int b);
  47. }
复制代码
4.public int Handler(Person p);//从一个对象中得到int范例的属性,如id属性

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. namespace DelegatePro
  7. {
  8.     //调用端
  9.     class DelegateInstantiation3
  10.     {
  11.         static void Main(string[] args)
  12.         {
  13.             //②实例化委托
  14.             //方法1,2 要先定义好(绑定好)方法
  15.             Person person = new Person
  16.             {
  17.                 id = 1001,
  18.                 name = "张三",
  19.                 age = 23
  20.             };
  21.             //Handler handler = new Handler(GetIdOfPerson);//写法1
  22.             //Handler handler = GetIdOfPerson;//写法2 GetIdOfPerson为委托对象
  23.             //方法3,4 不需要先定义好(绑定好)方法
  24.             //方法3 匿名方法
  25.             //Handler handler = delegate (Person p)
  26.             //{
  27.             //    return p.id;
  28.             //};
  29.             //方法4 Lambda表达式
  30.             //写法1
  31.             //Handler handler = (Person p) =>
  32.             //{
  33.             //    return p.id;
  34.             //};
  35.             //写法1的简化
  36.             //Handler handler = (p) =>
  37.             //{
  38.             //    return p.id;
  39.             //};
  40.             //写法2
  41.             Handler handler = p => p.id;
  42.             //③调用委托
  43.             int res = handler(person);
  44.         }
  45.         static int GetIdOfPerson(Person p)
  46.         {
  47.             return p.id;
  48.         }
  49.     }
  50.     //定义端
  51.     //①定义委托 和定义好的方法的返回值类型,形参列表要对应
  52.     public delegate int Handler(Person p);
  53.     public class Person
  54.     {
  55.         public int id;
  56.         public string name;
  57.         public int age;
  58.     }
  59. }
复制代码

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

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

郭卫东

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表