[C#3.0系列分享] 似曾相识的匿名类型

    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 });

转载于:https://www.cnblogs.com/OliveSky/archive/2008/08/16/1269282.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值