对象集合初始化器
在 .NET 2.0 中构造一个对象的方法一是提供一个重载的构造函数,二是用默认的构造函数生成一个对象,然后对其属性进行赋值。
在 .NET 3.5/C# 3.0 中,我们有一种更好的方式来进行对象的初始化,那就是使用对象初始化器。(这个特性也是匿名类的一个基础,所以放在匿名类之前介绍)
对象初始化:
User user = new User { Id = , Name = "Zouqj", Age = };
集合初始化:
List<Dog> dogs = new List<Dog>()
{
new Dog() { Name = "Tom", Age = },
new Dog() { Name = "Lucy", Age = }
};
创建并初始化数组:
string[] array = { "西施", "貂蝉" };
匿名类
匿名类型提供了一种方便的方法,可用来将一组只读属性封装到单个对象中,而无须首先显式定义一个类型。(每个属性的类型由编译器推断)
我们可以使用 new { object initializer } 或 new[ ] { object, …} 来初始化一个匿名类或不确定类型的数组。
匿名类的对象需要使用 var 关键字声明。示例如下:
var p = new { Id = , Name = "zouqj", Age = }; //属性名字和顺序不同会生成不同类
应用场景:
直接使用 select new { object initializer } 这样的语法就是将一个 LINQ 查询的结果返回到一个匿名类中。
注意:
当出现“相同”的匿名类时,编译器只会创建一个匿名类。(类型名由编译器生成,并且不能在源代码级使用)
编译器如何区分匿名类是否相同:
属性名、属性值(因为这些属性是根据值来确定类型的)、属性个数、属性的顺序。
匿名类的属性是只读的,可放心传递,并且可用在线程间共享数据。