您的位置:首页 > 编程学习 > C# > 正文

C#匿名类

更多 时间:2015-3-22 类别:编程学习 浏览量:209

C#匿名类

C#匿名类

C#匿名类型允许定义行内类型,无须显式定义类型。常和var配合使用来声明匿名类型。

一、匿名类的定义

1、匿名类型提供了一种方便的方法,可用来将一组只读属性封装到单个对象中,而无需首先显式定义一个类型。

2、类型名由编译器生成,并且不能在源代码级使用。每个属性的类型由编译器推断。

3、可通过使用 new 运算符和对象初始值创建匿名类型。

4、所有的匿名类型都直接继承自System.Object,并且重写了方法Equals(),GetHashCode(),ToString()等方法。

 

二、匿名类的实例

 

  •  
  • C# 代码   复制
  • 
    var annoyCla1 = new
        {
            ID = 10010,
            Name = "EdisonChou",
            Age = 25
        };
    
        Console.WriteLine("ID:{0}-Name:{1}-Age:{2}", annoyCla1.ID,annoyCla1.Name, annoyCla1.Age);
    
    		
  •  

    三、匿名类的共享

    可以想象一下,如果我们的代码中定义了很多匿名类,那么是不是编译器会为每一个匿名类都生成一个泛型类呢?答案是否定的,编译器考虑得很远,避免了重复地生成类型。换句话说,定义了多个匿名类的话如果符合一定条件则可以共享一个泛型类。

    1、如果定义的匿名类与之前定义过的一模一样:属性类型和顺序都一致,那么默认共享前一个泛型类

  •  
  •  
  • C# 代码   复制
  • 
    var annoyCla1 = new
                {
                    ID = 10010,
                    Name = "EdisonChou",
                    Age = 25
                };
    
                Console.WriteLine("ID:{0}-Name:{1}-Age:{2}", annoyCla1.ID,
                    annoyCla1.Name, annoyCla1.Age);
                Console.WriteLine(annoyCla1.ToString());
    
                // 02.属性类型和顺序与annoyCla1一致,那么共同使用一个匿名类
                var annoyCla2 = new
                    {
                        ID = 10086,
                        Name = "WncudChou",
                        Age = 25
                    };
                Console.WriteLine("ID:{0}-Name:{1}-Age:{2}", annoyCla1.ID,
                    annoyCla1.Name, annoyCla1.Age);
                Console.WriteLine("Is The Same Class of 1 and 2:{0}",
                    annoyCla1.GetType() == annoyCla2.GetType());
    
    		
  • 通过上述代码中的最后两行:我们可以判断其是否是一个类型?答案是:True

     

    2、如果属性名称和顺序一致,但属性类型不同,那么还是共同使用一个泛型类,只是泛型参数改变了而已,所以在运行时会生成不同的类:

  •  
  •  
  • C# 代码   复制
  • 
    var annoyCla3 = new
                    {
                        ID = "EdisonChou",
                        Name = 10010,
                        Age = 25
                    };
                Console.WriteLine("ID:{0}-Name:{1}-Age:{2}", annoyCla3.ID,
                    annoyCla3.Name, annoyCla3.Age);
                Console.WriteLine("Is The Same Class of 2 and 3:{0}",
                    annoyCla3.GetType() == annoyCla2.GetType());
    
    		
  • 我们刚刚说到虽然共享了同一个泛型类,只是泛型参数改变了而已,所以在运行时会生成不同的类。最后两行代码所显示的结果应该是False,他们虽然都使用了一个泛型类,但是在运行时生成了两个不同的类。

     

    3、如果数据型名称和类型相同,但顺序不同,那么编译器会重新创建一个匿名类

  •  
  •  
  • C# 代码   复制
  • 
    var annoyCla4 = new
                    {
                        Name = "EdisonChou",
                        ID = 10010,
                        Age = 25
                    };
                Console.WriteLine("ID:{0}-Name:{1}-Age:{2}", annoyCla4.ID,
                    annoyCla4.Name, annoyCla4.Age);
                Console.WriteLine("Is The Same Class of 2 and 4:{0}",
                    annoyCla4.GetType() == annoyCla2.GetType());
    
    		
  • 运行判断结果为:False

     

    标签:面向对象
    您可能感兴趣