开场白:本文为个人笔记,参考微软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 };//错误
隐含类型局部变量要点
- var为关键字,可以根据后面的初始化语句自动推断类型,这个类型为强类型。
- 初始化语句必须为表达式,不可以为空。且编译时可以推断类型。一旦初始化之后,只可以存储这种类型。
- var声明的仅限于局部变量,不可用于字段。亦可以用于for,foreach,using 等语句中。
- 数组也可以作为隐含类型。
- 初始化语句不能是一个自身的对象或者集合初始化器,但是他可以是包含一个对象或者初始化器的一个new表达式。
- 如果局部变量声明包含了多个声明符,其类型必须相同。
- 如果该处包含了一个自定义的Var类型,则优先该自定义的Var类型
扩展方法(Extension Methods)
扩展方法允许我们在不改变源代码的情况下扩展(即添加不能修改)现有类型中的实例方法。
例如我们要检查一个字符串变量是否是合法的电子邮件地址?在.Net2.0框架下像这样:
var email = "aa@qq.com"; 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){} 所有东西都是全局函数
扩展方法要点
- 扩展方法的本质为将实例方法调用在编译期改变为静态类中的静态方法调用。事实上,它确实拥有静态方法所具有的所有功能。
- 扩展方法的作用域是整个namespace可见的,并且可以通过using namespace来导入其它命名空间中的扩展方法。
- 扩展方法的优先级:现有实例方法优先级最高,其次为最近的namespace下的静态类的静态方法,最后为较远的namespace下的静态类的静态方法。
- 扩展方法是一种编译时技术,注意与反射等运行时技术进行区别,并慎重使用。
- 扩展类:1继承 2包含 在一个新类里面执行另外一个类的方法,并添加新功能 3反射 动态的给一个类型添加行为 4扩展方法 this
对象与集合初始化器(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 };
对象与集合初始化器要点
- 对象初始化器实际上利用了编译器对对象中对外可见的字段和属性进行按序赋值。
- 对象初始化器允许只给一部分属性赋值,包括internal访问级别
- 对象初始化器可以结合构造函数一起使用,并且构造函数初始化先于对象初始化器执行。
- 集合初始化器会对初始化器中的元素进行按序调用ICollection<T>.Add(T)方法。
- 注意对象初始化器和集合初始化器中成员的可见性和调用顺序。
- 对象与集合初始化器同样是一种编译时技术。
匿名类型(Anonymous Types)
var p1=new{Name="Law",Price=44.00};
var p2=new{Name="Shovel",Price=26.65};
p1=p2;//在局部范围内如果参数一样,认为两个类型是同一个类型,允许其赋值
匿名类型要点
- 可以使用new关键字调用匿名初始化器创建一个匿名类型的对象。
- 匿名类型直接继承自System. Object。
- 匿名类型的成员是编译器根据初始化器推断而来的一些读写属性。
- 优点是可以用来临时存数据用