隐式类型
对象集合初始化器
匿名类
匿名方法
扩展方法
Lambda表达式
自动属性
在于简化了私有成员+属性的编程方式,我们只需要使用如下方式声明一个属性,编译器会自动生成所需的成员变量:public int Id {get; set; },以前老写法:private int id;public int Id {get{return id}; set{id=value}; }
隐式类型
var,编译器会自动根据其赋值语句推断这个局部变量的类型。赋值以后,这个变量的类型也就确定而不可以再进行更改。另外var关键字也用于匿名类的声明。
对象初始化器与集合初始化器
.NET3.5/C#3.0开始,我们可以使用对象初始化器与集合初始化器新的语法糖来初始化对象或数据集。
一个对象初始化器:Student student =new Student { Id = 1, Name ="YJingLee", sex= "女",Scroe=90 };
一个集合初始化器,以页面下拉框值为例:List<selectlistitem> list = new List<selectlistitem>(){new SelectListItem{Value="1",Text="text1"},new SelectListItem{Value="2",Text="text2"}};
匿名类
匿名类型提供了一种方便的方法,可用来将一组只读属性封装到单个对象中,而无需首先显式定义一个类型。 类型名由编译器生成,并且不能在源代码级使用。 每个属性的类型由编译器推断。
可通过使用 new 运算符和对象初始值创建匿名类型。
以下示例用户基本属性进行初始化的匿名类型。
声明: var user = new { id=1,name = "xx", password = "***" };
调用: user.name
匿名方法
在 2.0 之前的 C# 版本中,声明委托的唯一方法是使用命名方法,C# 2.0 引入了匿名方法。
要将代码块传递为委托参数,创建匿名方法则是唯一的方法。 这里是个示例:
delegate void Del(int x);
// 这是初始化委托用的是匿名方法。
Del d = delegate(int k) { /* 方法中体相关操作 */ };
作用:通过使用匿名方法,不用创建单独的方法,因此减少了实例化委托所需的编码工作,提高效率。
扩展方法
面向对象设计开闭原则:对修改关闭,对扩展关闭。扩展方法使您能够向现有类“增加”方法,而无需创建新的派生类、重新编译或以其他方式修改原始类,我们们只需要新增一个静态类,在静态类为行为类扩展新的行为。
我们拿一段Web开发框架的扩展方法来说明:
/// <summary>
/// 提供一组在View中使用的用于页面布局元素的扩展方法。
/// </summary>
public static class LayoutExtensions
{
/// <summary>
/// 根据用户的帐号获取用户的显示名称。
/// </summary>
public static string DisplayUserName(this HtmlHelper htmlHelper, string userAccount)
{
return DisplayUserNameHelper(userAccount);
}
这个扩展方法我们实现一个根据用户的帐号获取用户的显示名称的功能,注意字体加粗部分,静态类LayoutExtensions,静态方法DisplayUserName第一个参数htmlHelper带this关键词,表示该方法是htmlHelper类的行为函数。
Lambda表达式
Lambda表达式简化了匿名委托的使用,让你让代码更加简洁,优雅。运算符 " => "可以叫“转到”或者 “成为”
语法糖:(input-parameters) => expression,这是最简单的一个例子 (x, y) => {x == y}
举例:
这是一个带数据模型的数据集合(ProductOverviewModel有Name属性): public IList<ProductOverviewModel> ProductOverviewModels { get; set; }
现在我们想改变数据集里面每一个ProductOverviewModel里面的属性Name的值,Lambda表达式改怎么写?List有个ForEach的函数,我们看该函数申明:public void ForEach(Action<t>
action),可以看到参数是一个Action委托函数。好了,我们实现该函数:
ProductOverviewModels.ToList().ForEach(product =>
{
product.Name="NewName";
});