匿名类型是在初始时根据=右边的表达式来推断出左边变量类型的一种机制。例如
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 });