当前位置: 首页 > 编程语言 > C# > 正文

c#3.0系列:Anonymous Type In CLR(3.5)

时间:2010-12-19 gjcn

我们说Anonymous Type是C# 3.0的新的特性,而没有说Anonymous Type 是.NET Framework 3.5的新特性。这是因为Anonymous Type仅仅是.NET Programming Language和相应的Compiler的新引入的特征。而对于.NET Framework 3.5来说,它看不到这和原来有什么不同,对于Anonymous Type和一 般的Named Type,对于CLR来说他们之间没有什么本质的区别。

通过下面这样的一段简单的代码:

1var p1 = new { Name = "IORI", Age = 27 };

然后我们再看看IL:

Code

1.method private hidebysig static void Main(string[] args) cil managed
2{
3 .entrypoint
4 // Code size    15 (0xf)
5 .maxstack 3
6 .locals init ([0] class '<>f__AnonymousType0`2'<string,int32> p1)
7 IL_0000: nop
8 IL_0001: ldstr   "IORI"
9 IL_0006: ldc.i4.s  27
10 IL_0008: newobj   instance void class '<>f__AnonymousType0`2'<string,int32>::.ctor(!0,
11                                             !1)
12 IL_000d: stloc.0
13 IL_000e: ret
14} // end of method Program::Main
15

我们再这里就可以看出Compiler将会为p1这个Anonymous Type创建一个名为 <>f__AnonymousType0`2<string,int32>的类型。参数将根据数据 成员的具体结构,这里也是声明一个类型。这个类继承自object,并且重写了 ToString() 和 GetHashCode()的实现。所有的匿名类型自动继承自 System.Object ,并且重写了Equals(), GetHashCode(), and ToString(). 如 下图:

结构如下:

internal sealed class <>f__AnonymousType0<<Name>j__TPar, <Age>j__TPar>
{
  // Fields
private readonly <Age>j__TPar <Age>i__Field;
    private readonly <Name>j__TPar <Name>i__Field;

   // Methods
public <>f__AnonymousType0 (<Name>j__TPar Name, <Age>j__TPar Age);

   public override bool Equals(object value);
    public override int GetHashCode();
    public override string ToString();

  // Properties
  public <Age>j__TPar Age { get; }
  public <Name>j__TPar Name { get; }
}