首页 > 代码库 > 匿名类型

匿名类型

1 匿名类型

     匿名类型就是通过隐式类型,对象初始化器来构造一个类型未知的对象,因此匿名类型可以在未知类型的时候创建对象。

     有以下代码:

           //匿名类型            var p1 = new { Name = "小王", Age = 25 };            var p2 = new { Name = "小明", Age = 27 };                        var p3 = new { Name = 24, Age = "小李" };            var p4 = new { Age = 34, Name = "小华" };            var p5 = new { Name2 = "小花", Age = 22 };            Console.WriteLine("p1==p2:{0}", p1.GetType() == p2.GetType());            Console.WriteLine("p1==p3:{0}", p1.GetType() == p3.GetType());            Console.WriteLine("p1==p4:{0}", p1.GetType() == p4.GetType());            Console.WriteLine("p1==p5:{0}", p1.GetType() == p5.GetType());

 

   运行结果:

      p1==p2:True
  p1==p3:False
  p1==p4:False
  p1==p5:False

 2  本质分析

     反编译代码IL如下图所示:

      

   从反编译代码中可以看出,匿名类型的本质一个私有的泛型类型 ,类中有只读字段 和只读属性

  2 分析运行结果

     (1)结论:

     初始化器中的参数名称、参数类型、参数的属性都一致时,这些匿名类型的对象都属于同一种数据类型,也就是由同一个类创建而来的不同对象,反之,则属于不同

   数据类型

      (2) 

        根据上面的运行结果,我们认为编译器会自动生成4个类,但是实际上是几个呢?我们反编译看一下:

       

            这里变量p3的初始化为什么要用第一个泛型类呢?这是因为初始化器中,如果参数的名称和顺序都相同,那么创建对象的时候会传入不同类型的参数来创建不同的类型对象

    

 

匿名类型