Keep on going never give up.

Let's Go

C# 学习笔记(57)对象、集合初始化器

C#Lonely2019-06-25 14:37:2955次0条

在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之前我们所编写的代码是一样的;但对于程序员来说,集合初始化器却有效地减轻了编程工作的负担。




暗锚,解决锚点偏移

文章评论

    嘿,来试试登录吧!