C# 匿名/委托/扩展方法/lambda表达式
匿名/委托/扩展方法/lambda表达式
推断类型Var关键字的使用
概念
var可以根据变量的初始值自动推断局部变量类型
注意问题:
- var只能定义局部变量,而不能定义成员变量
- 定义的时候必须同时完成初始化,而不能使用var定义变量为null
- var本身不是一个新类型,只是用来修饰一个可以推断出具体类型的局部变量
var定义变量与object类型定义的区别
推断类型var总结
使用var应该注意的问题
匿名类
什么是匿名类
匿名类的特点
- 直接使用new关键字创建对象,使用var定义对象变量
- 而不需要提前编写类的成员,并且只能添加对象的属性
分析匿名类的本质
简单扩展方法的应用
体验扩展方法的使用
扩展方法定义
不带参数的扩展方法定义
static 方法名(this 目标类型 目标类型参数)
带参数的扩展方法定义
static 方法名(this 目标类型 目标类型参数,参数类型1,参数名2,…)
扩展方法使用中应该注意的问题
- 扩展方法必须定义在静态类中,扩展方法本身也是静态方法
- 如果扩展方法和对应的类位于不同的命名空间,使用时应引入扩展方法所在静态类的命名空间
- 当类本身的方法与扩展方法重名时,类本身的方法被优先调用
- 扩展方法不要过多使用
定义带参数的扩展方法
继承的局限性
开发中遇到的问题
- 公司购买了一个第三方编写的模块用于项目研发,该模块被封装在了DLL中,现在需要对第三方模块中某一个类增加一个方法,怎么办?
解决办法:使用继承
使用扩展方法解决上面的问题
结论:使用扩展方法让系统的扩展更灵活,更方便!
委托
委托像是—种调用,委托像是—种引用指针
委托的使用
了解委托(delegate)
- 委托是一种新的面向对象语言特性,运行与.NET平台之上
- 基于委托,开发事件驱动的应用程序非常简单
- 使用委托可以大大简化多线程编程的难度
理解委托
- 委托,也可以看成是一种数据类型,可以用于定义变量,但他是一种特殊的变量
- 委托定义的变量能接收的数值只能是一个方法(函数),可以理解成委托就是一个方法(方法)的指针
委托使用的基本步骤
匿名方法与lambda表达式
匿名方法
匿名方法的概念和使用
匿名方法允许将代码块(方法体部分)通过委托变量作为参数传递,以代替单独定义的方法
Lambda表达式
C#3.0引入了Lambda表达式,利用它们可以更简练地编写代码块
()=>{}
有什么=>做什么
Lambda表达式定义规范与使用说明
- 参数列表中的参数类型可以是“明确”类型或者是“推断”类型
- 如果是推断类型,则参数的数据类型将由编译器根据上下文自动推断出来
关于Lambda表达式中的符号
- Lambda运算符=>,该运算符读为“goes to”。
- 该Lambda运算符的左边是输入参数(如果有),右边包含表达式或语句块。Lambda表达式x=>x*x 读作“x goes to x times x"
Lambda与匿名方法比较
- Lambda表达式本身就是匿名方法
- Lambda表达式的参数允许不指明参数类型,而匿名方法的参数必须明确指明参数类型
- Lambda表达式方法体允许由单一表达式或者多条语句组成,而匿名方法不允许单一表达式形式
示例

1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 namespace LinqDemo 6 { 7 class Program 8 { 9 //示例1:使用var推断类型 10 static void Main(string[] args) 11 { 12 var a = 20; 13 var bookName = ".NET开发"; 14 var objStudent = new Student() { StudentName = "小张", Age = 22 }; 15 Console.WriteLine("共有{0} 个人在学习{1} 系列课程,其中{2} ,{3}岁,已经是高手了。", 16 a, bookName, objStudent.StudentName, objStudent.Age); 17 Console.ReadLine(); 18 } 19 //示例2:普通变量定义方法与var定义的比较 20 //static void Main(string[] args) 21 //{ 22 // int a = 20; 23 // string bookName = ".NET开发"; 24 // Student objStu = new Student() { StudentName = "小张", Age = 22 }; 25 // Console.WriteLine("共有{0} 个人在学习{1} 系列课程,其中{2} ,{3}岁,已经是高手了。", 26 // a, bookName, objStu.StudentName, objStu.Age); 27 // Console.ReadLine(); 28 //} 29 // 示例3:var与object的区别 30 //static void Main(string[] args) 31 //{ 32 // object b = 20; 33 // b = ".NET开发"; 34 // var a = 20; 35 // a = ".NET开发"; 36 // Console.ReadLine(); 37 //} 38 //示例4:匿名类的使用 39 //static void Main(string[] args) 40 //{ 41 // var objPerson = new 42 // { 43 // Name = "小王", 44 // Age = 25, 45 // ClassName = "软件1班" 46 // }; 47 // Console.WriteLine("姓名:{0} 年龄:{1} 班级:{2}", 48 // objPerson.Name, objPerson.Age, objPerson.ClassName); 49 // Console.ReadLine(); 50 //} 51 //var使用应注意的问题 52 //static void Main(string[] args) 53 //{ 54 // var a=2008; 55 // var b =new int[] { 1, 2, 3 }; 56 // var e = "北京"; 57 // Console.WriteLine("a={0} e={1}", a, e); 58 // Console.ReadLine(); 59 //} 60 //static void Main(string[] args) 61 //{ 62 // Console.Write("请输入您的姓名:"); 63 // string stuName = Console.ReadLine(); 64 // Console.WriteLine(); 65 // Console.Write("请输入您的5门课程总成绩:"); 66 // int sum = int.Parse(Console.ReadLine()); 67 // Console.WriteLine(); 68 // Console.WriteLine("{0}{1}", stuName.StuInfo(), sum.GetAvg()); 69 // Console.ReadLine(); 70 //} 71 //示例7:定义和使用带参数的扩展方法 72 //static void Main(string[] args) 73 //{ 74 // Student objStudent = new Student() { StuName = "张晓丽" }; 75 // string info = objStudent.ShowStuInfo(67, 89); 76 // Console.WriteLine(info); 77 // Console.ReadLine(); 78 //} 79 //static void Main(string[] args) 80 //{ 81 // int a; //定义变量 82 // a = 100; //给变量赋值 83 // int b = a + 10; //使用变量 84 //} 85 //示例8:委托的定义与使用 86 //static void Main(string[] args) 87 //{ 88 // //【3】创建委托对象,关联“具体方法” 89 // CalculatorDelegate objCal = new CalculatorDelegate(Add); 90 // //【4】通过委托去调用方法,而不是直接使用方法 91 // int result = objCal(10, 20); 92 // Console.WriteLine("10+20={0}", result); 93 // //【5】根据需要,变换委托的指向 94 // objCal -= Add; //断开当前委托对象所关联的方法(加法) 95 // objCal += Sub; //重新指向一个新的方法(减法) 96 // result = objCal(10, 20); //重新使用委托对象,完成减法功能 97 // Console.WriteLine("10-20={0}", result); 98 // Console.ReadLine(); 99 //} 100 ////【2】根据委托定义一个“具体方法”实现加法功能 101 //static int Add(int a, int b) 102 //{ 103 // return a + b; 104 //} 105 ////【2】根据委托定义一个“具体方法”实现减法功能 106 //static int Sub(int a, int b) 107 //{ 108 // return a - b; 109 //} 110 //示例9:匿名方法的使用 111 //static void Main(string[] args) 112 //{ 113 // //委托变量接收一个匿名方法 114 // CalculatorDelegate objCal = delegate(int a, int b) 115 // { 116 // return a + b; 117 // }; 118 // int result = objCal(10, 20); 119 // Console.WriteLine("10+20={0}", result); 120 // Console.ReadLine(); 121 //} 122 ////示例11:Lambda表达式的定义与使用 123 //static void Main(string[] args) 124 //{ 125 // //委托变量接收一个Lambda表达式 126 // CalculatorDelegate objCal = (int a, int b) => { return a + b; }; 127 // int result = objCal(10, 20); 128 // Console.WriteLine("10+20={0}", result); 129 // Console.ReadLine(); 130 //} 131 //示例12:Lambda表达式的更多应用方法 132 //static void Main(string[] args) 133 //{ 134 // MathDelegate objMath = a => a * a; 135 // int result = objMath(10); 136 // Console.WriteLine("a的平方={0}", result); 137 // Console.ReadLine(); 138 //} 139 } 140 public delegate int MathDelegate(int a); 141 //【1】声明委托(定义一个函数的原型:返回值 + 参数类型和个数) 142 public delegate int CalculatorDelegate(int a, int b); 143 }
END
本文作者:云谷の风
本文链接:https://www.cnblogs.com/zeon/p/16324728.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?