对象和集合初始值设定项(C# 编程指南)
使用对象初始值设定项可以在创建对象时向对象的任何可访问的字段或属性分配值,而无需显式调用构造函数。 下面的示例演示如何将对象初始值设定项用于命名类型 (Cat)。 请注意,在 Cat 类中使用了自动实现的属性。 有关更多信息,请参见自动实现的属性(C# 编程指南)。
class Cat
{
// Auto-implemented properties.
public int Age { get; set; }
public string Name { get; set; }
}
Cat cat = new Cat { Age = 10, Name = "Fluffy" };
将对象初始值设定项用于匿名类型
尽管对象初始值设定项可以用在任何上下文中,但它们在 LINQ 查询表达式中尤其有用。 查询表达式常使用只能通过使用对象初始值设定项进行初始化的匿名类型,如下面的声明所示。
var pet = new { Age = 10, Name = "Fluffy" };
利用匿名类型,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};
将对象初始值设定项用于可以为 null 的类型
它是使用可以为 null 的结构的对象初始值设定项的编译时错误。
集合初始值设定项
在初始化该集合的选件类实现 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
};
示例
// The following code consolidates examples from the topic.
class ObjInitializers
{
class Cat
{
// Auto-implemented properties.
public int Age { get; set; }
public string Name { get; set; }
}
static void Main()
{
Cat cat = new Cat { Age = 10, Name = "Fluffy" };
List<Cat> cats = new List<Cat>
{
new Cat(){ Name = "Sylvester", Age=8 },
new Cat(){ Name = "Whiskers", Age=2 },
new Cat(){ Name = "Sasha", Age=14 }
};
List<Cat> moreCats = new List<Cat>
{
new Cat(){ Name = "Furrytail", Age=5 },
new Cat(){ Name = "Peaches", Age=4 },
null
};
// Display results.
System.Console.WriteLine(cat.Name);
foreach (Cat c in cats)
System.Console.WriteLine(c.Name);
foreach (Cat c in moreCats)
if (c != null)
System.Console.WriteLine(c.Name);
else
System.Console.WriteLine("List element has null value.");
}
// Output:
//Fluffy
//Sylvester
//Whiskers
//Sasha
//Furrytail
//Peaches
//List element has null value.
}