1、匿名类的使用
匿名类是C# 3.0/.NET 3.x中新增特性,在匿名类的语法中并没有为其命名,而是直接使用new { }方式。
例如,
var anonyClass= new
       {
           ID = 1000,
           Name = "CJavaPy",
           Age = 3
       };
Console.WriteLine("ID:{0}-Name:{1}-Age:{2}", anonyClass.ID,anonyClass.Name, anonyClass.Age);注意:通过反编译工具可以看出匿名类被编译后会生成一个[泛型类],且匿名类所生成的属性都是只读的,与其对应的字段也是只读的;匿名类还重写了基类的三个方法:Equals,GetHashCode和ToString;
2、匿名类的共享
1)如果定义的匿名类与之前定义过的一模一样:属性类型和顺序都一致,则默认共享前一个泛型类。
var annoyClass1 = new
{
    ID = 1010,
    Name = "C",
    Age = 3
};
Console.WriteLine("ID:{0}-Name:{1}-Age:{2}", annoyClass1.ID,
    annoyClass1.Name, annoyClass1.Age);
Console.WriteLine(annoyClass1.ToString());
// 属性类型和顺序与annoyClass1一致,共同使用一个匿名类
var annoyClass2 = new
    {
        ID = 1020,
        Name = "Python",
        Age = 5
    };
Console.WriteLine("ID:{0}-Name:{1}-Age:{2}", annoyClass1.ID,
    annoyClass1.Name, annoyClass1.Age);
Console.WriteLine("annoyClass1.GetType() == annoyClass2.GetType():{0}",
    annoyClass1.GetType() == annoyClass2.GetType());   2)如果属性名称和顺序一致,但属性类型不同,还是共同使用一个泛型类,只是泛型参数改变了而已,所以在运行时会生成不同的类:
var annoyClass2 = new
    {
        ID = 1020,
        Name = "Python",
        Age = 5
    };
var annoyClass3 = new
    {
        ID = "Java",
        Name = 1030,
        Age = 7
    };
Console.WriteLine("ID:{0}-Name:{1}-Age:{2}", annoyClass3.ID,
    annoyClass3.Name, annoyClass3.Age);
Console.WriteLine("annoyClass3.GetType() == annoyClass2.GetType():{0}",
    annoyClass3.GetType() == annoyClass2.GetType());3)如果数据型名称和类型相同,但顺序不同,那么编译器会重新创建一个匿名类
var annoyClass2 = new
    {
        ID = 1020,
        Name = "Python",
        Age = 5
    };
var annoyClass4 = new
    {
        Name = "JavaScript",
        ID = 1030,
        Age = 7
    };
Console.WriteLine("ID:{0}-Name:{1}-Age:{2}", annoyClass4.ID,
    annoyClass4.Name, annoyClass4.Age);
Console.WriteLine("annoyClass4.GetType() == annoyClass2.GetType():{0}",
    annoyClass4.GetType() == annoyClass2.GetType());
相关文档:C# 匿名方法