C#高级特性:匿名类型
- 匿名类型是由编译器临时创建的用来保存一组值的简单类。可以用new来创建一个匿名类型,并在后面跟上对象初始化器“{}”,在里面指定类型包含的属性名称和值,名值对:
var dude = new { Name = "Bob", Age = 23 };
编译器将这个语句编译成类似于下面的东西:
internal class AnonymousGeneratedTypeName
{
private string name; // Actual field name is irrelevant
private int age; // Actual field name is irrelevant
public AnonymousGeneratedTypeName (string name, int age)
{
this.name = name; this.age = age;
}
public string Name { get { return name; } }
public int Age { get { return age; } }
// The Equals and GetHashCode methods are overridden (see Chapter 6).
// The ToString method is also overridden.
}
...
var dude = new AnonymousGeneratedTypeName ("Bob", 23);
你必须使用var关键字去引用一个匿名类型,因为它没有名字。
匿名类中属性名可以根据表达式中得到,如:
int Age = 23;
var dude = new { Name = "Bob", Age, Age.ToString().Length };
等同于:
var dude = new { Name = "Bob", Age = Age, Length = Age.ToString().Length };
如果在相同的程序集中声明的两个匿名类型具有相同生命顺序和类型和名字的参数,那么认为这两个匿名类型是相同的。
var a1 = new { X = 2, Y = 4 };
var a2 = new { X = 2, Y = 4 };
Console.WriteLine (a1.GetType() == a2.GetType()); // True
此外,Equals方法在匿名类型中被重写了,从而能够执行正确的等于比较运算:
Console.WriteLine (a1 == a2); // False
Console.WriteLine (a1.Equals (a2)); // True
你可以像下面这样创建一个匿名类型的数组:
var dudes = new[]
{
new { Name = "Bob", Age = 30 },
new { Name = "Tom", Age = 40 }
};
匿名类型在c#3.0被引入,主要是为了LINQ这个更大的概念。在linq的学习中,我们将继续介绍这个类型。