在学习ASP.NET MVC之前,有必要先了解一下C#3.0所带来的新的语法特性,这一点尤为重要,因为在MVC项目中我们利用C#3.0的新特性将会大大的提高我们的开发效率,同时,在MVC项目中你将到处可以看到C#3.0新特性的身影。
这个概念很简单,其简化了我们在.NET的时候手写一堆私有成员+属性的编程方式,我们只需要使用如下方式声明一个属性,编译器会自动生成所需的成员变量。
基本用法:
public class User { public int Id { get; set; } public string Name { get; set; } public int Age { get; set; } public Address Address { get; set; } }
在C#3.0之前,我们是这样来实现属性的:
private int id; public int Id { get { return id; } set { id = value; } }
这个名称可能对你很陌生,但是var这个关键字应该都用过,在C#中使用var声明一个对象时,编译器会自动根据其赋值语句推断这个局部变量的类型。赋值以后,这个变量的类型也就确定而不可以再进行更改。另外var关键字也用于匿名类的声明。
应用场合:var主要用途是表示一个LINQ查询的结果。这个结果可能是ObjectQuery<>或IQueryable<>类型的对象,也可能是一个简单的实体类型的对象。这时使用var声明这个对象可以节省很多代码书写上的时间。
var customer = new Customer();
对象初始化器
在.NET2.0中构造一个对象的方法一是提供一个重载的构造函数,二是用默认的构造函数生成一个对象,然后对其属性进行赋值。在.NET3.5/C#3.0中我们有一种更好的方式来进行对象的初始化。那就是使用对象初始化器。这个特性也是匿名类的一个基础,所以放在匿名类之前介绍。
基本用法:
User user = new User { Id = 1, Name = "Zouqj", Age = 26 };
匿名类
有了前文初始化器的介绍,匿名类就很简单了。我们可以使用new { object initializer }或new[]{ object, …}来初始化一个匿名类或不确定类型的数组。匿名类的对象需要使用var关键字声明。示例代码:
var p = new { Id = 1, Name = " Zouqj ", Age = 26 };
应用场合:
当直接使用select new { object initializer }这样的语法就是将一个LINQ查询的结果返回到一个匿名类中。
Lambda表达式
Lambda表达式的本质就是匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数。“Lambda 表达式”是一个匿名函数,它可以包含表达式和语句,并且可用于创建委托或表达式树类型。
Lambda 表达式的运算符 =>,该运算符读为“goes to”。
=> 运算符具有与赋值运算符 (=) 相同的优先级
Lambda的基本形式:(input parameters) => expression
只有在 Lambda 有一个输入参数时,括号才是可选的;否则括号是必需的。 两个或更多输入参数由括在括号中的逗号分隔: (x, y) => x == y
有时,编译器难于或无法推断输入类型。 如果出现这种情况,您可以按以下示例中所示方式显式指定类型: (int x, string s) => s.Length > x
使用空括号指定零个输入参数: () => SomeMethod()
最常用的场景:Ienumable和Iqueryable接口的Where<>(c=>c.Id>3)
下列规则适用于 Lambda 表达式中的变量范围:
捕获的变量将不会被作为垃圾回收,直至引用变量的委托超出范围为止。
在外部方法中看不到 Lambda 表达式内引入的变量。
Lambda 表达式无法从封闭方法中直接捕获 ref 或 out 参数。
Lambda 表达式中的返回语句不会导致封闭方法返回。
Lambda 表达式不能包含其目标位于所包含匿名函数主体外部或内部的 goto 语句、break 语句或 continue 语句。
例子:
delegate int AddDel(int a,int b); //定义一个委托 #region lambda AddDel fun = delegate(int a, int b) { return a + b; }; //匿名函数 //Console.WriteLine(fun(1, 3)); //lambda 参数类型可以进行隐式推断,可以省略类型 lambda本质就是匿名函数 AddDel funLambda = ( a, b) => a + b; List<string> strs = new List<string>() { "1","2","3" }; var temp = strs.FindAll(s => int.Parse(s) > 1); foreach (var item in temp) { Console.WriteLine(item); } //Console.WriteLine(funLambda(1,3)); #endregion
static void Main(string[] args)
{
List<int> nums = new List<int>() { 1,2,3,4,6,9,12};
//使用委托的方式
List<int> evenNums = nums.FindAll(new Program().GetEvenNum);
foreach (var item in evenNums)
{
Console.WriteLine(item);
}
Console.WriteLine("使用lambda的方式");
List<int> evenNumLamdas = nums.FindAll(n => n % 2 == 0);
foreach (var item in evenNumLamdas)
{
Console.WriteLine(item);
}
Console.ReadKey();
//nums.FindAll(
}
public bool GetEvenNum(int num)
{
if (num % 2 == 0)
{
return true;
}
return false;
}