C#2.0 推出了匿名方法,C# 3.0推出匿名类型,难道这年头啥都得匿名了吗?

   匿名类型是在初始时根据=右边的表达式来推断出左边变量类型的一种机制。例如

   var parameter = 1;

   parameter在执行完这条语句之后,类型会被定义为int型。熟悉script语言的朋友要笑了,这不就是script中的var吗?其实不然,

  如果这样写

  var parameter = 1;

  parameter = "BBSC";

  编译器又要报错了,因为C# 依然是一种强类型语言,设立Var不过是让编译器去推断变量的类型。

  让我们来看看编译器到底做了什么?

  以数值常量和字符串常量来推断的情况比较简单,主要是引用类型的情况。

  一个例子

   var p1 = new { Name = "LCD TV", Price = 495.00 }

   var p2 = new{ Name = "LCD", Price = 26.95 };

   p1 = p2;

   让我们来看看编译器到底做了什么呢

   public class   *****      //*****代表类的名称,与用户书写代码无关

  { 

      private string _name;

      public string Name

      {

                get{return _name;}

                set{set _name=value;}

       }

      private string _price;

      public string Price

      {

                get{return _price;}

                set{set _price=value;}

       }

 

       public *****()        //相应的构造函数

       {}

}

 

 

   匿名类里面的字段类型是编译器自己推断出来的。如果两个匿名类结构相同,就像上面的那种情况,编译器只会生成一个匿名类。并且相互可以赋值

 

   那为什么要推出匿名类型呢?仅仅是显示编译器的智能吗?   答案仍然在LinQ中

 

   locals = customers.where(ZipCode == 98112).select(Name, Address);

   这是一句LinQ的查询语句,对于等号=右边的语句返回值, 传统的语法要建立一个类型

   class CustomerTuple

  {

     public string Name;

     public string Address;

    public CustomerTuple(string name, string address)

    {

        this.Name = name;

        this.Address = address;

    }

}

为此,我们可能要为不同的查询语句建立很多不同的类型,这将大大增加开发人员的工作量,影响代码的简洁

这样的匿名类型就很好的解决了这样的问题,因为一切都由编译器帮你完成了

  var locals =

   customers

       .Where(c => c.ZipCode == 91822)

       .Select(c => new { FullName = c.FirstName + + c.LastName,

                          HomeAddress = c.Address });