天天看點

C# 對象集合初始化

一、自動實作的屬性

public class Person
    {
        // C# 3之前我們定義屬性時,一般會像下面這樣去定義
        // 首先會先定義私有字段,再定義屬性來對字段進行通路
        //private string _name;
        //public string Name
        //{
        //    get { return _name; }
        //    set { _name = value; }
        //}

        // C# 3之後有自動實作的屬性之後
        // 對于不需要額外驗證的屬性,就可以用自動實作的屬性對屬性的定義進行簡化
        // 不再需要額外定義一個私有字段了,
        // 不定義私有字段并不是此時沒有了私有字段,隻是編譯器幫我們生成一個匿名的私有字段,不需要我們在代碼中寫出
        // 減少我們書寫的代碼
        // 下面就是用自動實作的屬性來定義的一個屬性,其效果等效于上面屬性的定義,不過比之前更加簡潔了

        /// <summary>
        ///  姓名
        /// </summary>
        public string Name { get; set; }
    }      

二、對象初始化

class Program
    {
        static void Main(string[] args)
        {
            Person person1 = new Person();
            person1.Name = "learning hard";
            person1.Age = 25;
            Person person2 = new Person("learning hard");
            person2.Age = 25;
            // 如果類沒有無參的構造函數就會出現編譯時錯誤
            // 因為下面的語句是調用無參構造函數來對類中的字段進行初始化的
            // 大括号部分就是對象初始化程式
            Person person3 = new Person { Name = "learning hard", Age = 25 };
            // 下面代碼和上面代碼是等價的,隻不過上面省略了構造函數的圓括号而已
            Person person4 = new Person() { Name = "learning hard", Age = 25 };
            Person person5 = new Person("learning hard") { Age = 25 };
        }
    }

    public class Person
    {
        public string Name { get; set; }
        public int Age { get; set; }

        public Person()
        {
        }

        public Person(string name)
        {
            this.Name = name;
        }
    }      

三、集合初始化

namespace ConsoleTest
{
    class Program
    {
        static void Main(string[] args)
        {
            // C# 3.0之前初始化集合使用的代碼
            List<string> names = new List<string>();
            names.Add("learning hard1");
            names.Add("learning hard2");
            names.Add("learning hard3");

            // 有了C# 3.0中集合初始化特性之後,就可以簡化代碼
            // 同時下面也使用了隐式類型(使用了var關鍵字)
            var newnames = new List<string>
            {
                "learning hard1","learning hard2", "learning hard3"
            };
        }
    }

    public class Person
    {
        public string Name { get; set; }
        public int Age { get; set; }

        public Person()
        {
        }

        public Person(string name)
        {
            this.Name = name;
        }
    }
}      

四、匿名類型

class Program
    {
        static void Main(string[] args)
        {
            // 定義匿名類型
            // 因為這裡不知道初始化的類型是什麼,是以這裡就必須使用隐式類型
            // 此時隐式類型就發揮出了功不可沒的作用,進而說明隐式類型的提出是為了服務于匿名類型的
            // 而匿名類型的提出又是服務于Linq,一步步都是在微軟團隊的計劃當中
            Console.WriteLine("進入匿名類型使用示範:");
            var person1 = new { Name = "learning hard", Age = 25 };
            Console.WriteLine("{0} 年齡為: {1}", person1.Name, person1.Age);

            // 定義匿名類型數組
            var personcollection = new[]
            {
                new {Name ="Tom",Age=30},
                new {Name ="Lily", Age=22},
                new {Name ="Jerry",Age =32},

                // 如果加入下面一句就會出現編譯時錯誤
                // 因為此時編譯器就不能推斷出要轉換為什麼類型
                // new {Name ="learning hard"}
            };

            int totalAge = 0;
            foreach (var person in personcollection)
            {
                // 下面代碼證明Age屬性是強類型的int類型
                totalAge += person.Age;
            }
        }
    }