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 }
View Code

 

 

END

posted @ 2022-05-29 19:47  云谷の风  阅读(107)  评论(0编辑  收藏  举报