5. Object and Collection Initializers(对象和集合初始器)
什么是Object Initializer(对象初始器)?顾名思义就是一种初始化对象的方式,这个“器”并非某个具体的类或者方法,我个人认为把它理解为一种新的语法形式更合适。
假设我们有一个用于学生个人信息的数据类,例如:
1: public class StudentData
2: {
3: private int _id = -1;
4: public int ID
5: {
6: get { return this._id; }
7: set { this._id = value; }
8: }
9:
10: private string _name = String.Empty;
11: public string Name
12: {
13: get { return this._name; }
14: set { this._name = value; }
15: }
16:
17: private int _age = 0;
18: public int Age
19: {
20: get { return this._age; }
21: set { this._age = value; }
22: }
23: }
这个数据类只用于在内存中保存用户信息的用途,那么如果是以往,我们会怎样初始化它呢?首先我们可以生成一个实例,然后把各个属性值一一赋给这个实例对象,或者如果这个类的属性数量不算多,我们也可以考虑提供一个包含所有属性的构造函数,这样我们只要在实例化的时候就可以把预先知道的属性值赋给这个对象。这是过去的老方法,那么既然C# 3.0给我们带来了新的对象初始器,那么新在哪里呢?请看下面一行代码:
1: StudentData student = new StudentData { ID = 0, Name = "ZeroCool", Age = 24 };
是的,在我们不需要提供任何自定义构造函数的情况下,对象初始器可以让我们实现在创建类实例的时候就对它进行初始化,可以想象一下对象初始器为我们节省了多少编写自定义构造函数的工作量。那么如果我们在数据类里面再嵌套数据类呢,比如说每个学生都有自己的各科成绩分数,而每个学生的科目又都是一样的,那么我们就可以建立一个成绩数据类,并把这个类作为一个属性放在学生的数据类里面,例如:
1: public class ScoresData
2: {
3: private double _chinese = 0d;
4: public double Chinese
5: {
6: get { return this._chinese; }
7: set { this._chinese = value; }
8: }
9:
10: private double _math = 0d;
11: public double Math
12: {
13: get { return this._math; }
14: set { this._math = value; }
15: }
16:
17: private double _english = 0d;
18: public double English
19: {
20: get { return this._english; }
21: set { this._english = value; }
22: }
23: }
然后在StudentData类里面增加一个属性:
1: private ScoresData _scores = new ScoresData();
2: public ScoresData Scores
3: {
4: get { return this._scores; }
5: }
接下来我们就可以在实例化StudentData类的时候就初始化它的各科成绩:
1: StudentData student = new StudentData { Scores = { Chinese = 87.3, Math = 91, English = 90 } };
这一次我们初始化时省略了其它3个属性,因为对象初始器并不要求开发人员如果使用它就必须一次性对所有属性进行初始化。
大家现在应该对对象初始器有了一定了解了吧,那么接下来我们再来看看什么是Collection Initializer(集合初始器)吧。理解了对象初始器之后想必再理解集合初始器就不难了,集合初始器显然就是在实例化集合类的时候采用的一种新的初始化方式:
1: List<string> nameList = new List<string> { "ZeroCool", "Autumoon", "Michael" };
没错,上面这行代码就是采用集合初始器的方式在实例化一个List对象的时候对它进行了初始化。我们也可以再来看一个稍微复杂一点的例子,假设我们在上面的StudentData类中再增加一个IM属性,一个学生允许有一个或多个即时通讯工具的帐号,如:
1: private List<string> _imAccounts = new List<string>();
2: public List<string> IMAccounts
3: {
4: get { return this._imAccounts; }
5: }
这次我们就可以这样来实例化一个学生对象了:
1: StudentData student = new StudentData { Name = "ZeroCool", IMAccounts = { "IM@hotmail.com", "87654321" } };
对象初始器和集合初始器大概就介绍到这里吧,这两个概念相对比较容易理解,只需要亲自动手写几行代码基本上就记住了,不过虽然它看上去很简单,但却为我们带来了更高的编码效率。下回我们一起来探讨一下Anonymous Types(匿名类型)吧。