您的位置:首页 > 编程语言 > C#

C# 3.0语言特性

2015-05-17 21:23 176 查看
关键字:隐式类型变量var、扩展方法(extension method)、lambda表达式、自动属性、匿名类型

一、隐式类型

  C#是强类型语言,意味着我们在声明变量时必须指定变量的具体类型,但是var可以代替正式的数据类型名(如int, bool, string),编译器会根据用于初始化局部变量的初始值推断出变量的数据类型;我们可以对基类库中的所有类型使用隐式类型,包括数组、泛型、自定义类型。

  使用限制:

    1、只能应用与方法或者属性内局部变量的声明,不能使用var来定义返回值、参数的类型或类型的数据成员;

    2、使用var进行声明的局部变量必须赋初始值,并且不能以null作为初始值。

  强类型数据:隐式类型初始化后编译器就已经推断出了确切类型,所以他是强类型。

  作用:可以动态根据查询本身的格式来创建结果集,这样我们就不需要显示定义查询可能返回的类型

二、自动属性

  因为.NET基类库总是使用类型属性而不是传统的访问和修改方法,所以.NET语言推荐使用类型属性来封装私有数据字段,而不是 使用GetXXX()和SetXXX()方法。 

  在底层,C#属性会被映射到前缀get_和set_的方法中,即如果定义了Name属性,C#会自动生成get_Name()和set_Name()方法。

  在定义自动属性时候,必须同时提供Get和Set关键字。

三、匿名类型

  类可以表达一个给定的编程实体,我们通常创建一个C#类,为该类提供必需的一系列属性、方法和事件等,以供重用;而有时候可能需要定义类来封装一些相关数据,而不需要任何相关联的方法、事件,或者该类不需要在项目间重用。

  C# 3.0提供的匿名类型,使用新的关键字var和之前介绍的对象初始化语法,如:var worker = new { FirstName = "Vincent", LastName = "Ke", Level = 2 };C#编译器会在编译时自动生成名称唯一的类。因为这个类的名字在C#中是不可见的,所以必需使用var关键字来使用隐式类型化。

  匿名类型内部表示:

    匿名类型都自动继承自System.Object,可以调用ToString()、GetHashCode()、Equals()、GetType()方法

四、扩展方法

  在 C#3.0 推出扩展方法之前,一旦一个类被编译进程序集后,便不能再修改该类型的定义了;为该类型添加、修改、删除成员的唯一办法就是修改类型的定义代码。当需要为类型添加新功能但并不拥有类型的已有代码时,比如,我们想要为.NET库类型List添加自定义的dump方法时,该怎么做呢,答案是扩展方法。扩展方法允许在不修改类型定义的情况下,让该类型获得功能上的扩展

  定义扩展方法:

    1、必须把方法定义在静态类中,因此每一个扩展方法也必须声明为静态的;

    2、要用this关键字对第一个参数进行修饰,这个参数也就是我们希望进行扩展的类型。

  

static class MyExtensions
{
// 本方法允许任何对象显示它所处的程序集
public static void DisplayDefiningAssemlby(this object obj)
{
Console.WriteLine("{0} is defined in: \n\t {1}\n",
obj.GetType().Name,
System.Reflection.Assembly.GetAssembly(obj.GetType()));
}
}


  调用扩展方法:

    两种方式来使用扩展方法:实例调用 和 静态调用。通过一个对象调用它的扩展方法只是编译器的烟幕弹效果而已,背后编译器会转换成静态方法的调用

五、Lambda表达式

  Lambda表达式的引入是与委托类型的使用密切相关的,本质上,Lambda表达式只是用更简单的方式来书写匿名方法,从而彻底简化.NET委托类型的使用    

     Lambda表达式可以应用于任何匿名方法可以应用的场合,而且比匿名方法更加简洁更节省编码时间。C#编译器只是把Lambda表达式翻译为相应的普通匿名方法而已。

     Lambda表达式的格式:先定义参数列表,”=>”标记(可读为:goes to)紧随其后,然后是表达式。即:ArgumentsToProcess => StatementsToProcessThem

     Lambda表达式的参数可以是显示类型化的也可以是隐式类型化的

     Lambda表达式也可以是一个代码块,其中包含多条代码语句,用花括号括起来即可

// 使用语句块编写Lambda表达式
List<int> evenNumbers = list.FindAll((int i) =>
{
Console.WriteLine("processing value: {0}", i);
bool isEven = (i % 2) == 0;
return isEven;
});


六、对象初始化器

     static void ObjectInitSyntax()
{
// 在这里,默认构造函数被隐式调用
Point bPoint = new Point { X = 10, Y = 20 };

// 我们也可以显示调用默认构造函数
Point cPoint = new Point() { X = 10, Y = 20 };

// 我们还可以调用自定义的构造函数,只是这里1, 2会被10, 20覆盖
Point dPoint = new Point(1, 2) { X = 10, Y = 20 };
}


  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: