匿名类型
允许我们创建无名类类型的特性。匿名类型(anonymous type)经常用于LINQ查询的结果中。
第6章介绍了对象初始化语句,它允许我们在使用对象创建表达式时初始化新类实例的字段和属性。提醒一下,这种形式的对象创建表达式由三部分组成:new关键字、类名或构造函数以及对象初始化语句。对象初始化语句在一组大括号内包含了以逗号分隔的成员初始化列表。
创建匿名类型的变量使用相同的形式,但是没有类名和构造函数。如下的代码行演示了匿名类型的对象创建表达式:
没有类名 ↓ new {FieldProp=InitExpr,FieldProp=InitExpr,...} ↑ 成员初始化语句
例:创建和使用匿名类型的示例。
class Program { static void Main() { 必须使用var ↓ var student=new{Name="Mary Jones",Age=19,Major="History"}; Console.WriteLine("{0},Age {1},Major: {2}",student.Name,student.Age,studeng.Major); } }
需要了解的有关匿名类型的重要事项如下。
- 匿名类型只能和局部变量配合使用,不能用于类成员
- 由于匿名类型没有名字,我们必须使用var关键字作为变量类型
- 不能设置匿名类型对象的属性。编译器为匿名类型创建的属性是只读的
当编译器遇到匿名类型的对象初始化语句时,它创建一个有名字的新类类型。低于每个成员初始化语句,它推断其类型并创建一个只读属性来访问它的值。属性和成员初始化语句具有相同名字。匿名类型被构造后,编译器创建了这个类型的对象。
除了对象初始化语句的赋值形式,匿名类型的对象初始化语句还有其他两种允许的形式:简单标识符和成员访问表达式。这两种形式叫做投影初始化语句(projection initializer)。下面的变量声明演示了3种形式。
var student=new{Age=19,Other.Name,Major};
例:使用3总初始化语句。注意,投影初始化语句必须定义在匿名类型声明之前。
class Other { static public string Name="Mary Jones"; } class Program { static void Main() { string Major="History"; var student=new{Age=19,Other.Name,Major}; Console.WriteLine("{0},Age {1},Major: {2}",student.Name,student.Age,studeng.Major); } }
如果编译器遇到了另一个具有相同的参数名、相同的推断类型和相同顺序的匿名类型,它会重用这个类型并直接创建新的实例,不会创建新的匿名类型。