陈斌彬的技术博客

Stay foolish,stay hungry

对象初始化器与集合初始化器和匿名类

对象初始化器与集合初始化器

在.NET2.0中构造一个对象的方法一是提供一个重载的构造函数,二 是用默认的构造函数生成一个对象,然后对其属性进行赋值。在.NET3.5/C#3.0 中我们有一种更好的方式来进行对象的初始化。那就是使用对象初始化器。这个特性也是匿名类的一个基础,所以放在匿名类之前介绍。

还是那就话,好的代码强于注释,下面用几个代码段说明初始化器:

基本用法:

User user = new User { Id = 1, Name = "YJingLee", Age = 22 };

嵌套使用:

User user = new User
{
    Id = 1,
    Name = "YJingLee",
    Age = 22,
    Address = new Address
    {
    City = "NanJing",
    Zip = 21000
    }
};

类似于对象初始化器初始化一个对象,集合初始化器初始化一个集合,一句话,有了它你就不用在将元素通过Add 逐个添加了。仍然给出代码示例: 基本使用:

List<int> num = new List<int> { 0, 1, 2, 6, 7, 8, 9 };

结合对象初始化器,我们可以写出如下简洁的代码:

List<User> user = new List<User>{
new User{Id=1,Name="YJingLee",Age=22},
new User{Id=2,Name="XieQing",Age=25},
};

应用场合:还是前文提到的select new classname语法,后面可以直接接一个初始化器来将查询结果返回到这个对象。

匿名类

有了前文初始化器的介绍,匿名类就很简单了。我们可以使用new { object initializer }new[]{ object, …} 来初始化一个匿名类或不确定类型的数组。匿名类的对象需要使用var关键字声明。示例代码:

var p1 = new { Id = 1, Name = "YJingLee", Age = 22 };

应用场合:

还是同上面的例子提到的当直接使用select new { object initializer }这样的语法就是将一个LINQ查询的结果返回到一个匿名类中。