一、var隐式类型
var dogName = "ruiky";
注意以下几点:
1、编译器会在编译时自动根据值得类型推断这个变量的类型;
2、变量类型不可改变,因为声明的时候已经确定类型了;
3、在声明一个隐式类型时,必须对他进行赋值,要不会报错;
4、var只能用于局部变量,不能将字段、属性,或者方法的返回值声明为隐式类型。
5、可以用来声明匿名类
二、带默认值的参数
void DefaultPara(int age = 10,string name ="james") { Console.WriteLine(age+" : "+name); }
三、集合初始化器、属性初始化器
对象初始化:
Dog dog = new Dog(){Name=“ruiky”,Age = 2};
集合初始化:
List<Dog> list = new List<Dog>() { new Dog() { Name = "Ruiky", Age = 2 }, new Dog() { Name = "r2", Age = 1 } };
四、匿名类
匿名类型允许开发者不必预先定义类型,就创建类型的实例
var developer=new { Name="leo", Age=30, Favorites=new[]{".net","Sql"} }; Console.WriteLine(developer.Name); Console.WriteLine(developer.Age); Console.WriteLine(String.Join(",",developer.Favorites)); 输出: leo, 30, .net,Sql
五、匿名方法
匿名方法的语法很简单:使用delegate关键字进行声明,后面跟随方法的参数列表,然后在花括号中编写方法体。
btn.Click+=deletgate(object sender,EventArgs e){ MessageBox.Show("haha") };
六、扩展方法
首先,扩展方法所在的类型要为静态类。
其次,被扩展的方法要为方法列表的第一个参数的类型,并且前面要加上this关键字。
编译器会在编译时找出第一个参数带了this关键字的静态类里的静态方法,识别为扩展方法。但是这个语法,运行时不认识,所以编译器要将其转为运行时能够识别的语法--特性。
七、系统内置泛型委托:Func/Action
Func委托,有输入参数,有返回值。
list.Select(new Func<Dog,SmallDog>(delegate(Dog d){return new SmallDog();})); //SmallDog为返回值类型
list.Select(delegate(Dog d){return new SmallDog();}); //简写,编译器自己推断返回值,SmallDog
list.Select(delegate(Dog d){return new {Age=d.Age,Date=DateTime.Now}); //简写,使用匿名类
Action委托,和Func委托类似,不过无返回值。
八、Lambda表达式
是匿名方法的简写,如果方法体不止一个,需要加上花括号。
例子:
list.ForEach(new Action<Dog>(delegate(Dog d){Console.Writeline(d.Name);})); list.ForEach(d=>Console.WriteLine(d.Name)); //上面的简写
Lambda表达式演化过程:
new Func<string,int>(delegate(string str){return str.Length;}); //系统委托 delegate(string str){return str.Length;} //匿名方法 (string str)=>{return str.Length;} //Lambda语句,可以写多条语句 (string str)=>str.Length //Lambda表达式 (str)=>str.Length //让编译器推断参数类型 str=>str.Length //去掉不必要的括号,当有多个参数时,小括号不能省