开场白:本文为个人笔记,参考微软MVP
自动属性(Auto-Implemented Properties)
隐含类型局部变量(Local Variable Type Inference)
扩展方法(Extension Methods)
对象与集合初始化器(Object and Collection Initializers)
匿名类型(Anonymous Types)
Lambda表达式和Lambda表达式树 (Lambda Expression and Lambda Expression Trees)
自动属性(Auto-Implemented Properties)
在.Net2.0框架下,我们可以这样写一个User类:
public class User { private int _id; private string _name; private int _age; public int Id { get { return _id; } set { _id = value; } } public string Name { get { return _name; } set { _name = value; } } public int Age { get { return _age; } set { _age = value; } } }
现在,可以这样简化:
public class User { public int Id { get; set; } public string Name { get; set; } public int Age { get; set; } }
隐含类型局部变量(Local Variable Type Inference)
var i = 5;//int
var j = 23.56;//double
var k = "C Sharp";//string
var a =new[]{1,34,45,45};//int[]
var x;//错误
var y = null;//错误
var z = { 1, 2, 3 };//错误
隐含类型局部变量要点
扩展方法(Extension Methods)
扩展方法允许我们在不改变源代码的情况下扩展(即添加不能修改)现有类型中的实例方法。
例如我们要检查一个字符串变量是否是合法的电子邮件地址?在.Net2.0框架下像这样:
var email = "[email protected]"; if (EmailValidator.IsValid(email)) { Response.Write("这是一个正确的邮件地址"); }
而使用扩展方法的话,我可以添加“IsValidEmailAddress()”方法到string类本身实例中去
if(email.IsValidEmailAddress()) //等同Extensions.IsValidEmailAddress(email)
{
Response.Write("这是一个正确的邮件地址");
}
先定义一个静态类,再定义“IsValidEmailAddress”这个静态的法来实现的。
public static class Extensions//静态类
{
public static bool IsValidEmailAddress(this string s)//this关键词告诉编译器,这个特定的扩展方法应该添加到类型为“string”的对象中去 {
Regex regex = new Regex(@"^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$");
return regex.IsMatch(s);
}
}
实例背后的编译
Person p=new Person();
p.Bar();//IL编译会将其变成Bar(p); void Bar(Person p){} 所有东西都是全局函数
扩展方法要点
对象与集合初始化器(Object and Collection Initializers)
对象初始化器 (Object Initializers)-->
User user = new User { Id = 1, Name = "a", Age = 22 };等价于User user=new Use(); user.Id=1;user.Name="a",user.Age=22;
//把二个人加到一个基于泛型的类型为User的List集合中:
List<User> user = newList<User>{
newUser{Id=1,Name="YJingLee",Age=22},
newUser{Id=2,Name="XieQing",Age=25},
};
集合初始化器(Collection Initializers)-->
集合初始化器可以简化把几个对象一起添加到一个集合,编译器会自动为你做集合插入操作。例如我把七个数加到一个基于泛型的类型为int的List集合中
List<int> num = new List<int> { 0, 1, 2, 6, 7, 8, 9 };
对象与集合初始化器要点
匿名类型(Anonymous Types)
var p1=new{Name="Law",Price=44.00};
var p2=new{Name="Shovel",Price=26.65};
p1=p2;//在局部范围内如果参数一样,认为两个类型是同一个类型,允许其赋值
匿名类型要点