C#的隐式类型、匿名类型、自动属性、初始化器

1.隐式类型

1)源起

在隐式类型出现之前,我们声明一个变量时,需要为它指定相应的类型,甚至在foreach一个集合的时候,也要为遍历的集合元素,指定变量的类型,隐式类型出现后,程序员就不用再做这个工作了。

2)使用方法

来看看下面的代码:

  1. var a=1;//int a=1;
  2. var b="123";//string b="123";
  3. var myObj=new MyObj();//MyObj myObj=new MyObj();

上面的每行代码,与后面的注释起到的作用完全一样。也就是说,在声明一个变量(并且同时给它赋值)的时候,完全不用指定变量的类型,只要一个var就可以解决问题。

3)这样做会降低性能吗?

不会!上面的代码和注释里的代码,编译后产生的IL代码(中间语言代码)是完全一样的(编译器会根据变量的值,推导出变量的类型,才产生IL代码)

4)这个关键字的好处:

在foreach一个集合时,可以使用var关键字代替书写循环变量的类型;(其它待发现。。)

5)注意事项

你不能用var关键字声明变量时不给它赋值,因为编译器无法推导出变量的类型。

2.匿名类型

1)源起

创建一个对象,一定要先定义这个对象的类型吗?不一定,看看下面的代码

2)使用

  1. var oddsAndEnds = new[]{
  2. new {Name="MVC" , Category="Pattern"},
  3. new {Name="Hat" , Category="Clothing"},
  4. new {Name="Apple" , Category="Fruit"}
  5. };
  6. StringBuilder result = new StringBuilder();
  7. foreach (var item in oddsAndEnds) {
  8. result.Append(item.Name).Append(" ");
  9. }

new关键字之后就直接为对象定义属性,并为这些属性赋值。而且,对象创建出来之后,在创建对象的方法中,还可以畅通无阻的访问对象的属性。

通过结合对象初始化器和类型推断,可以创建简答的数据存储对象,而不需要定义相应的类或结构。

3.自动属性

1)源起

为一个类定义属性,我们一般会写如下的代码

  1. public class product
  2. {
  3. private string name;
  4. private int price;
  5. public string Name
  6. {
  7. get { return name; }
  8. set { name = value; }
  9. }
  10. public int Price
  11. {
  12. get { return price; }
  13. set { price = value; }
  14. }
  15. }

但很多时候,这些私有变量对我们一点用处都没有,比如对象关系映射中的实体类。自C#3.0引入了自动实现的属性,以上代码可以写成如下形式:

  1. public class product
  2. {
  3. public string name { get; set; }
  4. public int price { get; set; }
  5. }

4.对象初始化器和集合初始化器

1)源起

我们创建一个对象并给它的属性赋值,代码一般写成这样子:

  1. var product=new Product();
  2. product.name="小米";
  3. product.price=3;

自C#3.0引入对象初始化器,代码可以写成如下形式:

  1. var product=new Product(){name="小米",price=3};

集合初始化器如下定义:

  1. var arr=new List<int>(){1,2,3,4,5,6};

参考资料:

30分钟LINQ教程

精通ASP.NET MVC 4