C#3.0 新特性学习笔记(3):匿名类型

 有些时候我们需要临时保存一些运算的中间结果,特别是当这些中间结果是由多个部份组成时,我们常常会去声明一个新的类型,

以方便保存这些中间结果。表面上看起来这很正常,而细想之后就会发现,这个新类型只服务于这个函数,其它地方都不会再使用它了,

就为这一个函数而去定义一个新的类型,确实有些麻烦。

现在,C#3.0中的匿名类型特性就可以很好的解决上面提到的问题,通过匿名类型,我们可以简单使用

   new { 属性名1=值1, 属性名2=值2, ..... , 属性名n=值n }

的形式直接在函数中创建新的类型,{ }是匿名初始化器。

对象:

看下面这个例子:

class AnonymousType : AppRunner.AbstractApplication 

 
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 p1 = new { name = ”reallypride”, age = 23 }; 
var p2 
= new { name = “jingxuan”, age = 23 }; 

那么,编译器会自动定义一个包含nameage属性的类。p1p2结构相同,是同一个类的实例。

下面,我们再定义一个变量,

var p3 = new { age = 23, name = “reallypride” }; 

表面上来看,意义是一样的,但是语法不同,这样编译器会新建一个新的类,也就是p3p1,p2不是同一个类的实例,因为p3声明属性的位置不相同。

数组:

如果要定义数组,可以这样定义:

var intArray = new[] { 1234 }; 
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一起使用。

原文地址:https://www.cnblogs.com/Dlonghow/p/1313317.html