在C#3.0之前定义类,你往往需要定义多个构造函数来完成不同情况的初始化。C#3.0提供了对象初始化器,它减少了我们在类中定义的构造函数代码,从而使代码更加简洁。在没有对象初始化器时,我们会像下面的代码那样去定义类。
class Program { static void Main(string[] args) { //使用构造函数初始化 Person p = new Person("张三"); Console.WriteLine(p.Name); Person p1 = new Person("李四","男"); Console.WriteLine(p1.Name+","+ p1.Gender); Person p2 = new Person("王五", "男",20); Console.WriteLine(p2.Name + "," + p2.Gender+","+p2.Age); Person p3 = new Person("赵六", "男", 22,"13888888888"); Console.WriteLine(p3.Name + "," + p3.Gender + "," + p3.Age+","+p3.Tel); Console.ReadKey(); } } public class Person { //名字 public string Name { get; set; } //性别 public string Gender { get; set; } //年龄 public int Age { get; set; } //电话 public string Tel { get; set; } public Person() { } public Person(string name) : this(name,string.Empty) { } public Person(string name, string gender) : this(name, gender,0) { } public Person(string name, string gender, int age) : this(name, gender, age, string.Empty) { } public Person(string name, string gender, int age, string Tel) { this.Name = name; this.Gender = gender; this.Age = age; this.Tel = Tel; } }
在C#3.0引入对象初始化器之后,你就不需要定义多个构造函数了,前面的代码可以简化为以下的形式:
class Program { static void Main(string[] args) { //使用对象初始化器初始化 //Person p = new Person() { Name = "张三" }; //这行代码和下面一行代码使等价的,只不过省略了构造函数的圆括号而已 Person p = new Person { Name = "张三" }; Console.WriteLine(p.Name); Person p1 = new Person { Name = "李四",Gender="男" }; Console.WriteLine(p1.Name+","+ p1.Gender); Person p2 = new Person { Name = "王五", Gender = "男" , Age =20}; Console.WriteLine(p2.Name + "," + p2.Gender+","+p2.Age); Person p3 = new Person { Name = "赵六", Gender = "男", Age = 22, Tel="13888888888" }; Console.WriteLine(p3.Name + "," + p3.Gender + "," + p3.Age+","+p3.Tel); Console.ReadKey(); } } public class Person { //名字 public string Name { get; set; } //性别 public string Gender { get; set; } //年龄 public int Age { get; set; } //电话 public string Tel { get; set; } }
以上代码可知,使用对象初始化器可使对象的初始化代码更加简洁。下面让我们来看看这个过程中编译器都做了些什么。首先C#编译器生成了一个Person类的临时对象,并调用Person类的默认无参的构造函数对其初始化,然后对它的属性进行逐个赋值,最终将临时对象赋值给你定义的Person类对象。
由此可想到要使用对象初始化器,你必须确保类具有一个无参构造函数(如果类中没有定义任何构造函数,编译器会帮我们生成一个默认无参的构造函数)。如果你自定义了一个有参构造函数而把默认无参构造函数覆盖,你则需要重新定义一个无参的构造函数,否则会出现编译器错误。
接下来我们再说说集合初始化器,它用来完成对集合中某一元素的初始化。再集合初始化器提出之前,你可能会使用下面的方式来初始化集合对象:
static void Main(string[] args) { //在C#3.0之前初始化集合时所使用的代码 List<string> list = new List<string>(); list.Add("张三"); list.Add("李四"); list.Add("王五"); Console.ReadKey(); }
有了集合初始化器特性之后,你可以使用更简洁的代码来完成初始化,具体的实现方式如下:
static void Main(string[] args) { //使用集合初始化器 List<string> list = new List<string> { "张三","李四","王五"}; Console.ReadKey(); }
从以上代码可知,使用集合初始化器确实能使代码更加简洁。但这一特性同样依赖编译器提供的帮助,它生成了一个临时对象,调用list的无参构造函数,然后调用Add方法,一个个地将初始化的内容添加了进去,最后将临时对象赋值给了你定义的对象。对于编译器而言,C#3.0中使用了集合初始化特性的代码和C#3.0之前我们所编写的代码是一样的;但对于程序员来说,集合初始化器却有效地减轻了编程工作的负担。
文章评论