C# 对象集合初始化

时间:2022-09-03 19:06:20

一、自动实现的属性

    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;
            }
        }
    }