粗谈C#1.0、C#2.0、C#3.0、C#4.0

首先我发现在我了解了C#这几个版本如何进化的后,我真心觉得以前写的代码都是用的C#1.0啊,感觉自己太落后,太低端了。

这些是我看了《深入理解C#》后得到的。

我们来看看C#几个版本写的一个类。

C#1.0:

3个缺点
using System.Collections;
class C1
    {
         //(1)此处创建属性和变量的代码过于复杂
        string name;
        public string Name { get { return name; } } //(2)为属性提供的公共取值方法,那么如果添加赋值方法则也是公共的
        int age;
        public int Age{get{return age;}}

        public C1(string name,  int   age)
        {
            this.name = name;
            this.age = age;
        }

        public static ArrayList GetSampleProduct()
        { //(3)list中可以添加其他类型的值也不会报错
            ArrayList list = new ArrayList();
            list.Add(new C1("Tom", 21));
            list.Add(new C1("Jerry", 32));
            list.Add(new C1("Sam", 14));
            list.Add(new C1("Lorwy", 22));
            return list;
        }

        public override string ToString()
        {
            //return base.ToString();
            return string.Format("{0}:{1}", Name, Age);
        }
        static void Main(string[] args)
        {
           ArrayList list = C1.GetSampleProduct();
            foreach (C1 c in list)
            {
                Console.WriteLine(c.ToString());
            }
            Console.ReadLine();
        }
    }

C#2.0:

粗体为改动代码
class C2
    {
        string name;
        public string Name
        {
            get { return name; }
             private set { name = value; }//属性拥有了私有的赋值方法,并在构造函数中用到
        }
        int age;
        public int Age
        {
            get { return age; }
             private set { age = value; }
        }

        public C2(string name, int age)
        {
             Name = name;
            Age = age;
        }

        public static  List<C2> GetSampleProduct()
        { //利用泛型是编译器能知道List<C2>告诉它该列表中只能存储C2类型的对象
             List<C2> list = new List<C2>();
            //ArrayList list = new ArrayList();
           list.Add(new C2("Tom", 21));
            list.Add(new C2("Jerry", 32));
            list.Add(new C2("Sam", 14));
            list.Add(new C2("Lorwy", 22));
            return list;
        }
        public override string ToString()
        {
            //return base.ToString();
            return string.Format("{0}:{1}", name, age);
        }
        static void Main(string[] args)
        {
            List<C2> list = C2.GetSampleProduct();
           //C1 c = null;
            foreach (C2 c in list)
            {
                Console.WriteLine(c.ToString());
            }
            Console.ReadLine();
        }
    }

C#3.0:


class C3
    {
        string name;
        public string Name
        { //自动实现的属性
             get;
            private set;
        }
        int age;
        public int Age
        {
             get;
            private set;
        }

         public C3()
        {
        }

        public static List<C3> GetSampleProduct()
        { //更简单的初始化
             return new List<C3>
            {
                new C3{Name="Tom", Age=21},
                new C3{Name="Jerry",Age=32},
                new C3{Name="Sam", Age=14},
                new C3{Name="Lorwy", Age=22}
            };
        }
        public override string ToString()
        {
            //return base.ToString();
            return string.Format("{0}:{1}",  Name, Age);
        }
        static void Main(string[] args)
        {
           List<C3> list = C3.GetSampleProduct();
            foreach (C3 c in list)
            {
                Console.WriteLine(c.ToString());
            }
            Console.ReadLine();
        }
    }

C#4.0:

//当方法或构造函数包含多个参数时可以使代码更清楚
 class C4
    {
         readonly   string name;
        public string Name{get{return name;} }
         readonly int age;
        public int Age { get { return age; } }

        public C4(string name,int age)
        {
            this.name = name;
            this.age = age;
        }

        public static List<C4> GetSampleProduct()
        {
            return new List<C4>
            {
                 new C4(name:"Tom", age:21),
                new C4(name:"Jerry",age:32)
                new C4(name:"Sam", age:14),
                new C4(name:"Lorwy",age:22)
            };
        }
        public override string ToString()
        {
            //return base.ToString();
            return string.Format("{0}:{1}", Name, Age);
        }
        static void Main(string[] args)
        {
           List<C4> list = C4.GetSampleProduct();
            foreach (C4 c in list)
            {
                Console.WriteLine(c.ToString());
            }
            Console.ReadLine();
        }
    }

几个版本之间的进化图:



C#1.0:按名字排序

class PeopleNameComparer : IComparer
    {
        public int Compare(object x, object y)
        {
            C1 first = (C1)x;
            C1 second = (C1)y;
            return first.Name.CompareTo(second.Name);
        }
    }
    class C1
    {
        //(1)此处创建属性和变量的代码过于复杂
        string name;
        public string Name { get { return name; } }//(2)为属性提供的公共取值方法,那么如果添加赋值方法则也是公共的
        int age;
        public int Age { get { return age; } }

        public C1(string name, int age)
        {
            this.name = name;
            this.age = age;
        }

        public static ArrayList GetSampleProduct()
        {//(3)list中可以添加其他类型的值也不会报错
            ArrayList list = new ArrayList();
            list.Add(new C1("Tom", 21));
            list.Add(new C1("Jerry", 32));
            list.Add(new C1("Sam", 14));
            list.Add(new C1("Lorwy", 22));
            return list;
        }

        public override string ToString()
        {
            //return base.ToString();
            return string.Format("{0}:{1}", Name, Age);
        }
        static void Main(string[] args)
        {
            ArrayList list = C1.GetSampleProduct();
            list.Sort(new PeopleNameComparer());
            foreach (C1 c in list)
            {
                Console.WriteLine(c.ToString());
            }
            Console.ReadLine();
        }
    }


C#2:按名字排序,引入泛型后

class PeopleNameComparer : IComparer<C2>
    {
        public int Compare(C2 x, C2 y)
        {
            C2 first = (C2)x;
            C2 second = (C2)y;
            return first.Name.CompareTo(second.Name);
        }
    }
    class C2
    {
        string name;
        public string Name
        {
            get { return name; }
            private set { name = value; }//属性拥有了私有的赋值方法,并在构造函数中用到
        }
        int age;
        public int Age
        {
            get { return age; }
            private set { age = value; }
        }

        public C2(string name, int age)
        {
            Name = name;
            Age = age;
        }

        public static List<C2> GetSampleProduct()
        {//利用泛型是编译器能知道List<C2>告诉它该列表中只能存储C2类型的对象
            List<C2> list = new List<C2>();
            //ArrayList list = new ArrayList();
            list.Add(new C2("Tom", 21));
            list.Add(new C2("Jerry", 32));
            list.Add(new C2("Sam", 14));
            list.Add(new C2("Lorwy", 22));
            return list;
        }
        public override string ToString()
        {
            //return base.ToString();
            return string.Format("{0}:{1}", name, age);
        }
        static void Main(string[] args)
        {
            List<C2> list = C2.GetSampleProduct();
            list.Sort(new PeopleNameComparer());
            foreach (C2 c in list)
            {
                Console.WriteLine(c.ToString());
            }
            Console.ReadLine();
        }
    }

也可以用这句话直接代替IComparer接口
list.Sort(delegate(C2 x, C2 y)
            { return x.Name.CompareTo(y.Name); });

C#3.0中用Lambda表达式

进一步用Lambda表达式来代替
list.Sort((x,y)=>x.Name.CompareTo(y.Name));
按序取得内容,列表的实际顺序并未发生变化,其中之所以能调用OrderBy方法,是因为存在一个扩展方法
foreach (C2 c in list.OrderBy(x=>x.Name))
            {
                Console.WriteLine(c.ToString());
            }





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值