香蕉视频app

Keep on going never give up.

Let's Go

C# 學習筆記(57)對象、集合初始化器

C#Lonely2019-06-25 14:37:2988次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之前我們所編寫的代碼是一樣的;但對于程序員來說,集合初始化器卻有效地減輕了編程工作的負擔。




暗錨,解決錨點偏移

文章評論

    嘿,來試試登錄吧!