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 [] {  1 2 3 4  }; 
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/archive/2008/10/17/1313317.html

你可能感兴趣的:(C#3.0 新特性学习笔记(3):匿名类型)