(一).NET新特性与LINQ基础
(1)推断类型var关键字的使用
var可以根据变量的初始值自动推断 局部变量 的类型
注意:
- var只能定义 局部变量,不能定义成员变量;
- 定义的时候必须同时完成 初始化,不能使用var定义变量为null;
- var本身不是一个新的类型;只是用来修饰一个可以推断出具体类型的局部变量;
与object类的区别
- object类是父类,或者祖先类,任何类型都可以转换为object类;
- var可以根据类型进行推断,但是一旦推断确定后,不能再次进行改变;
(2)匿名类的使用
//直接匿名使用,在使用之前,并没有定义这个类
class Program
{
static void Main(string[] args)
{
var objPerson = new
{
Name = "张三",
Age = 26,
ClassName = "三班"
};
Console.WriteLine("姓名:{0}, 年龄:{1}, 班级:{2}", objPerson.Name, objPerson.Age, objPerson.ClassName);
}
}
特点:
- 直接使用new关键字创建对象,使用var定义对象变量;
- 不需要提前编写类的类型;并且只能添加对象的属性,不能添加方法;
注意:
(3)简单拓展方法的使用
扩展方法必须在静态类中定义;
扩展方法是一种特殊的静态方法;
第一个参数前加关键字 this , int 表示为所有的 int类型添加扩展方法;
注意:是对类的进行扩展
namespace test
{
//扩展方法类(必须是静态的)
static class ExtendMethod
{
//this 必须添加;int代表给int类添加扩展方法;sum不是参数,只是表示当前变量
public static double GetAvg(this int mySum)
{
return mySum *1.0 / 5;
}
}
class Program
{
static void Main(string[] args)
{
Console.WriteLine("chengji:");
int sum = Convert.ToInt32(Console.ReadLine());
//这里调用了扩展类,括号中没有参数,因为这个扩展类不需要参数,那个mySum是当前变量,实际上是这里的sum
Console.WriteLine("{0}", sum.GetAvg());
}
}
}
拓展方法解决的一个问题
- 当一个类使用sealed关键字,这样这个类不能被继承;
- 这个时候,想要在这个类中增加一个方法,就要适应拓展方法;
附加内容
扩展方法使用之中注意的问题(总结):
- 扩展方法必须定义在静态类中;扩展方法本身也是静态方法;
- 扩展方法和对应的类位于不同的命名空间,使用的时,应该引入扩展方法所在静态类的命名 空间;
- 当类本身的方法与扩展方法重名时,类本身的方法优先调用;
- 扩展方法不要过多使用;(静态方法占用内存)
(4)委托的基本使用
<1> 了解并理解委托(delegate)
- 了解委托:
- 委托是一种新的面向对象语言特性,运行于.NET 平台之上;
- 基于委托,开发事件驱动的应用程序非常简单;
- 使用委托可以大大简化多线程编程的难度;
- 理解委托:
<2> 委托的使用
- 委托一般定义在类的外部;
- 委托代表的是方法,方法必须与委托吻合;
- 委托是一种特殊的引用类型;
using System;
namespace LinqDemo
{
class Program
{
static void Main(string[] args)
{
//【3】创建委托对象,关联具体方法
CalculateorDelegate objCal = new CalculateorDelegate(Add); //添加默认的方法
//【4】通过委托调用方法,而不是直接调用方法
int result = objCal(10, 20);
Console.WriteLine(result);
//【5】根据需要变换委托的指向
objCal -= Add; //断开当前委托所关联的方法(加法)
objCal += Sub; //重新关联一个方法(减法)
result = objCal(10, 20);
Console.WriteLine(result);
}
//【2】根据委托定义具体方法(加法、减法)
static int Add(int a, int b)
{
return a + b;
}
static int Sub(int a, int b)
{
return a - b;
}
}
//【1】声明委托(定义一个函数的原型:返回值+参数类型和个数)
public delegate int CalculateorDelegate(int a, int b);
}
(5)匿名方法与Lambda表达式
<1> 匿名方法
匿名方法允许将代码块(方法体部分)通过委托变量作为参数传递,以代替单独定义的方法;
using System;
namespace LinqDemo
{
class Program
{
static void Main(string[] args)
{
CalculateorDelegate objCal = delegate (int a, int b)
{
return a + b;
};
int result = objCal(20, 10);
Console.WriteLine(result);
}
}
//【1】声明委托(定义一个函数的原型:返回值+参数类型和个数)
public delegate int CalculateorDelegate(int a, int b);
}
<2> Lambda 表达式
- 引入Lambda 表达式可以更简练的编写代码块;
- 下面的Lambda表达式实际上与上面的匿名方法等价;
using System;
namespace LinqDemo
{
class Program
{
static void Main(string[] args)
{
CalculateorDelegate objCal = (int a, int b) => { return a + b; };
int result = objCal(12, 45);
Console.WriteLine(result);
}
}
//【1】声明委托(定义一个函数的原型:返回值+参数类型和个数)
public delegate int CalculateorDelegate(int a, int b);
}
using System;
namespace LinqDemo
{
class Program
{
static void Main(string[] args)
{
MathDelegate objDelegate = a => a * a;
Console.WriteLine(objDelegate(4));
}
}
//【1】声明委托(定义一个函数的原型:返回值+参数类型和个数)
public delegate int MathDelegate(int a);
}
<3>Lambda表达式总结
-
关于Lambda表达式中的符号
- Lambda 运算符 =>,读作“goes to”;Lambda表达式 x => x*x,读作“x goes to x times x”;
- 该Lambda运算符的左边是输入参数(如果有),右边包含表达式或者语句块;
-
Lambda 表达式与匿名方法比较:
- Lambda表达式本身就是匿名方法;
- Lambda表达式的参数允许不指明参数类型,而匿名方法的参数必须明确指明参数类型;
- Lambda表达式方法允许由单一表达式或者多条语句组成,而匿名方法不允许单一表达式形式;