C#3.0新特性(二)
对象和集合初始值设定项
使用对象初始值设定项可以在创建对象时向对象的任何可访问的字段或属性分配值,而无需显式调用构造函数。
private class Cat
{
// Auto-implemented properties
public int Age { get; set; }
public string Name { get; set; }
}
static void MethodA()
{
// Object initializer
Cat cat = new Cat { Age = 10, Name = "Sylvester" };
}
a.将对象初始值设定项用于匿名类型
尽管对象初始值设定项可以用在任何上下文中,但它们在 LINQ 查询表达式中尤其有用。查询表达式经常使用匿名类型,而这些类型只能使用对象初始值设定项进行初始化。在 select 子句中,查询表达式可以将原始序列的对象转换为可能具有不同的值和形式的对象。如果您只想存储某个序列中每个对象的部分信息,这会非常有用。在下面的示例中,假定某个产品对象 (p) 包含很多字段和方法,而您只想创建包含产品名称和单价的对象序列。
var productInfos =
from p in products
select new { p.ProductName, p.UnitPrice };
当执行此查询时,productInfos 变量将包含一个对象序列,而这些对象可以在 foreach 语句中访问,如下面的示例所示:
foreach(var p in productInfos){...}
新的匿名类型中的每个对象都具有两个公共属性,这两个属性具有与原始对象中的属性或字段相同的名称。还可以在创建匿名类型时重命名字段;下面的示例将 UnitPrice 字段重命名为 Price。
select new {p.ProductName, Price = p.UnitPrice};
b.集合初始值设定项
使用集合初始值设定项可以在初始化一个实现了 IEnumerable 的集合类时指定一个或多个元素初始值设定项。元素初始值设定项可以是简单的值,也可以是表达式或对象初始值设定项。通过使用集合初始值设定项,您将无需在源代码中指定多个对该类的 Add 方法的调用;编译器会添加这些调用。
下面的示例演示了两个简单的集合初始值设定项:
List<int> digits = new List<int> { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
List<int> digits2 = new List<int> { 0 + 1, 12 % 3, MakeInt() };
下面的集合初始值设定项使用对象初始值设定项来初始化在前面的一个示例中定义的 Cat 类的对象。请注意,各个对象初始值设定项被分别括在大括号中,并且用逗号分隔。
List<Cat> cats = new List<Cat>
{
new Cat(){ Name="Sylvester", Age=8 },
new Cat(){ Name="Whiskers", Age=2},
new Cat() { Name="Sasha", Age=14}
};
如果集合的 Add 方法允许,可以将 null 指定为集合初始值设定项中的一个元素。
List<Cat> moreCats = new List<Cat>
{
new Cat(){ Name="Furrytail", Age=5 },
new Cat(){ Name="Peaches", Age=4},
null
};