第一章:C#开发的进化史

1.类和属性的进化

 

   在版本1中只能这样:

    class product
    {
        private string prname;
        public string Name
        {
            get { return prname; }
            set { prname = value; }
        }
 
        // 只读属性
        private string prage;
        public string Age
        {
            get { return prage; };
        }
    }

    也就是说get set的访问可访问范围必须一致,为了让属性只读或只写,只能省略掉对应的访问器。

 

    到了版本2可以在访问器前增加不同的作用域约束,既实现了对外的只读只写,也实现到了更好的属性封装。

    class product
    {
        private string prname;
        public string Name
        {
            get { return prname; }
            set { prname = value; }
        } 

        // 只读属性
        private string prage;
        public string Age
        {
            get { return prage; }
            private set { prage = value; } // 实现了更好的属性封装
        }
    }

 

    再看版本3中的改进,还是比较大的。

    class product
    {
        public string Name { getset; } 

        // 只读属性
        public string Age
        {
            get;
            private set// 实现了更好的属性封装
        }
    }

    // 而且在实例化对象时可以同时初始化属性
    new product() {Name="tom"};

    // 等价于
    new product().Name="tom"

 

    版本4中我认为几乎没怎么改动,虽然书上说有相应变动但我更相信所谓变动是设计上得变动而不是语言的改变。

 

2.排序与过滤

 

    我们知道所谓配需是指按照某种规则重新定义对象在集合中的位置,一般来说我们对值类型的配需是按它的字面值大小做排序规则的。但是如果对我们刚才定义的类实例集合做排序改怎么做呢?应为类对象无法表示哪个“大” 哪个“小”,所以C#允许我们自定义规则。比如我们想按照属性 Age的大小来做排序,我们需要自定义一个规则类,该类继承一个系统借口,版本1下完整代码如下:

    class Product
    {
        public string Name { getset; } 

        public int Age { getset; }
    }

    // 自定义排序规则类
    class orderbyAge : IComparer
    {
        public int Compare(object x, object y)
        {
            return ((Product)x).Age.CompareTo((Product)y);
        }
    }

    // 初始化一个对象列表
    ArrayList products = new ArrayList();
    Product item1 = new Product();
    item1.Age = "20岁";
    products.Add(item1);
    products.Add(new Product());
    ...
            
    // 用我们定义的排序规则对列表做排序
    products.Sort(new orderbyAge());
   
    这时products内的元素已经按新规则重新排列了

    我们可以看到通过这种方式也可以对自定义类做排序了。我们也可以定义多个配需规则在不同的情况下做不同的排序。例如我们还可以按照Name排序。

 

    虽然原理相同但版本2做了优化处理,首先支持了范型类型推出用LIST<T>替代ArrayList,由于范型的特性使得数据操作时大大减少了拆装箱过程所以性能有很大提升,而且范型类型也使得集合的数据类型得以加强减少错误元素增加。在此基础上我们用新特性匿名方法来直接传递内联的排序规则而不需要预先定义排序类。

    ...

    // 初始化一个对象列表
    List<Product> products = new List<Product>();
    products.Add(new Product() {Name ="tom",Age =20 });
    //...
    products.Add(new Product() { Name = "cat", Age = 40 });

 

    // 用我们定义的匿名方法排序规则对列表做排序            
    products.Sort(delegate(Product x, Product y) { return x.Age.CompareTo(y); });


    // 等价于
    Comparison<Product> order = delegate(Product x, Product y) { return x.Age.CompareTo(y); };
    products.Sort(order);

    Comparison<T> 完整定义是:delegate int Comparison<in T>(T x, T y)

 

    版本3进了一步使用Lambda代替匿名方法程序显得更加紧凑。

    // 初始化一个对象列表
    List<Product> products = new List<Product>();
    products.Add(new Product() {Name ="tom",Age =20 });
    //...
    products.Add(new Product() { Name = "cat", Age = 40 });
            
    // 用我们定义的排序规则对列表做排序
    products.Sort((x,y) => x.Age.CompareTo(y));

    // 等价于
    Comparison<Product> order = (x, y) => x.Age.CompareTo(y);
    products.Sort(order);

 

3.查询集合

   

    对于查询我用一个简单的例子对照个版本的实现代码,区别很明显

    // 版本1下
    ArrayList objlist = new ArrayList();
    ...
    foreach (Product it in objlist)
    {
        if (it.Age > 20)
        {
            Console.WriteLine(it.Name);
        }
    }

    // 版本2 3 4下
    List<Product> products = new List<Product>();
    ...

    // 版本2下
    products.FindAll(delegate(Product x) { return x.Age > 20; }).ForEach(delegate(Product y) { Console.WriteLine(y.Name); });

    // 版本3,4下
    products.FindAll(x => x.Age > 20).ForEach(y => Console.WriteLine(y.Name));

 

4.其他内容概述

    以上只是大概举了几个例子用来说明个版本之间的进化程度除此之外还有很多特性,例如版本2中应用的值得可空类型,版本4中方法参数的默认值,版本3中的LINQ,var类型还有动态类型等等以后章节中会一一详细说明。

posted on 2012-03-29 19:03  老金  阅读(449)  评论(0编辑  收藏  举报