有些时候我们需要临时保存一些运算的中间结果,特别是当这些中间结果是由多个部份组成时,我们常常会去声明一个新的类型,
以方便保存这些中间结果。表面上看起来这很正常,而细想之后就会发现,这个新类型只服务于这个函数,其它地方都不会再使用它了,
就为这一个函数而去定义一个新的类型,确实有些麻烦。
现在,C#3.0中的匿名类型特性就可以很好的解决上面提到的问题,通过匿名类型,我们可以简单使用
new { 属性名1=值1, 属性名2=值2, ..... , 属性名n=值n }
的形式直接在函数中创建新的类型,{ }是匿名初始化器。
对象:
看下面这个例子:
{
public override void Run()
{
var anonymousType1 = new {
CardNumber = " 10001 " , Name = " van’s " , Sex = true
};
Console.WriteLine(anonymousType1.CardNumber);
Console.WriteLine(anonymousType1.Name);
var anonymousType2 = new {
CardNumber = " 10002 " , Name = " martin " , Sex = true
};
anonymousType2 = anonymousType1;
}
}
在新类型中只能有字段成员,而且这些字段的类型也是通过初值的类型推断出来的。如果在声明新的匿名类型时,新类型的字段名、
顺序以及初始值的类型是一致的,那么将会产生相同的匿名类型,所以上例中anonymousType1和anonymousType2的类型是相同的,
自然能进行anonymousType2=anonymousType1的赋值。
关于这点,可以参考如下比较:
var p2 = new { name = “jingxuan”, age = 23 };
那么,编译器会自动定义一个包含name和age属性的类。p1和p2结构相同,是同一个类的实例。
下面,我们再定义一个变量,
表面上来看,意义是一样的,但是语法不同,这样编译器会新建一个新的类,也就是p3和p1,p2不是同一个类的实例,因为p3声明属性的位置不相同。
数组:
如果要定义数组,可以这样定义:
var strArray = new [] { “a”, “b”, “c” };
var someTypeArray =
new [] {
new { name = “reallypride”, age = 23 },
new { name = “jingxuan”, age = 23 }
};
匿名类型要点:
1. 可以使用new关键字调用匿名初始化器创建一个匿名类型。
2. 匿名类型直接继承自System.Object。
3. 匿名类型的属性是编译器根据初始化器自动推断。
匿名类型常和var一起使用。