目录
一.推断类型var关键字
a.可以根据变量的初始值自动推断局部变量类型
注意: 1.只能定义局部变量,而不能定义成员变量;
2.定义的同时必须同时完成初始化,而不能使用var定义变量为null;
3.var本身不是一种新的类型,只是用来修饰可以推断出具体类型的局部变量.
var的本质:var类型和普通类型在代码编译过程的IL完全一样
b.var定义变量与object类型定义的区别
var定义的类型,一旦确定类型,就无法更改
二.匿名类的使用
var student = new
{
Name = "张三",
Age = 21,
Project = "科学"
};
Console.WriteLine("姓名{0},年龄{1},课程{2}",student.Name,student.Age,student.Project);
上述中,student就是匿名类,该类在使用时同样可以使用智能感应,即可以通过变量点出属性。
特点:直接使用new关键字创建对象,使用var定义对象变量,而不需要提前编写类的成员,并且只能添加对象的属性
本质:编译器自动为匿名类生成名称
使用var注意的问题:
var a;//必须进行初始化--> var a = 11;
var b = {1,2,3};//无法用数组数组初始值初始化隐式类型的局部变量 --> var b = new int[]{1,2,3};
var c = null;//无法将null赋予隐式的局部变量 --> var c = "李四";
三.简单扩展方法的应用
扩展方法必须定义在静态类中定义,第一个参数前加关键字this,其中的num和name为当期那变量,而非参数
//定义
namespace Linq
{
static class ExtendMethod
{
//定义int类型的扩展方法
public static int GetAvg(this int num)
{
return num/2;
}
public static string Info(this string name)
{
return string.Format("{0},平均数为:",name);
}
}
}
//使用
static void Main(string[] args)
{
string name = "张三";
int totalScore = 500;
Cosole.WriteLine("{0}{1}",name.Info(),totalScore.GetAvg());
}
//结果:
输出为:张三,平均数为250
用处:如果需要给第三方的类新增方法,但是该类型已被sealed修饰,可以通过扩展方法解决,克服了继承的局限性
扩展方法的定义详解:
不带参数的扩展方法定义:
static 方法名 (this 目标类型 目标类型参数)
带参数的扩展方法定义:
static 方法名 (this 目标类型 目标类型参数,参数类型1,参数类型1的参数名,...)
扩展方法使用中应该注意的问题:
1.扩展方法必须定义在静态类中,扩展方法本身也是静态方法
2.如果扩展方法和对应的类位于不同的命名空间,使用时应该引用扩展方法所在静态类的命名空间
3.当类本身的方法与扩展方法重名时,类本身的方法被优先调用
4.扩展方法不要过多使用(静态方法,占用内存)
四、委托的基本使用
1.了解委托
*委托是一种新的面向对象语言特性,运行于.NET平台之上
*基于委托,开发事件驱动的应用程序非常简单
*使用委托可以大大简化多线程编程的难度
2.理解委托
a.委托,也可以看成是一种数据类型,可以用于定义变量,但他是一种特殊的变量(只能接受一个方法)
b.委托定义的变量能接收的数值只能是一个方法(函数),可以理解成委托就是一个方法(方法)的指针
方法调用-->委托对象-->方法1,方法2,..(可以联想成律师,当事人的关系来进行理解,委托对象就是律师,方法调用为法院,方法为当事人),通过委托对象处理更加灵活
委托一般定义在类的外面
1.申明委托(定义函数的原型:返回值+参数类型和个数,定义在类的外面)
public delegate int CalculatorDelegate(int a,int b);//没有方法体
2.根据委托定义具体方法(方法定义在类中)
static int Add(int a,int b){return a+b;}
static int Sub(int a,int b){return a-b;}
3.创建委托对象,关联具体方法
CalculatorDelegate objcal = new CalculatorDelegate(Add);
4.通过委托调用方法,而不是直接使用方法
int result = objcal (10,20);
5.根据需要变换委托指向
objCal -= Add;//断开当前委托所关联的方法
objCal += Sub;//重新关联新方法
五、匿名方法与Lambda表达式
1.匿名方法
匿名方法没有具体名称,只有委托关键字、方法参数、方法体
匿名方法的特点:允许将代码块(方法体部分)通过委托变量作为参数传递,以代替单独定义的方法
static void Main(string[] args)
{
//objCal为委托变量
CalculatorDelegate objCal = delegate(int a,int b)
{
return a+b;//方法体
};
int result = objCal(5,10);
}
2.Lambda表达式
1.C#3.0引入Lambda表达式,利用它们可以更简练的编写代码块
(参数列表) => {方法体} goes to
static void Main(string[] args)
{
//委托变量接收一个Lambda表达式
//(int a,int b) =>{return a+b;};为Lambda表达式
CalculatorDelegate objCal = (int a,int b) =>{return a+b;};
int result = objCal(5,10);
}
2.Lambda表达式定义规范与使用说明
a.参数列表中的参数类型可以是“明确”类型或者是“推断”类型
b.如果是推断类型,则参数的数据类型将由编译器根据上下文自动推断出来
//a,b为推断类型参数
Calculator objCal = (a,b) => {return a+b;};
static void Main(string[] args)
{
MathDelegate objMath = a =>a*a;//如果参数只有一个可以省略();如果方法体只有一行代码乐意省略{}
int result = objMath(10);
}
public delegate int MathDelegate(int a);
3.Lambda表达式符号
a.Lambda运算符 => 读作"goes to"
b.Lambda运算符的左边是输入参数(如果有),右边为表达式或语句块。Lambda表达式 x => x*x读作"x goes to x times x"
4.Lambda表达式与匿名方法比较
a.lambda表达式本身就是匿名方法
b.lambda表达式的参数允许不指明参数类型,而匿名方法的参数必须明确指明参数类型
c.lambda表达式方法允许由单一表达式或者多条语句组成,而匿名方法不允许单一表达式形式