一起学习-深入理解C#第二版(1)——1.1从简单的数据开始..

HI,大家好,先自我介绍下,本人在某互联网广告公司 工作了3年,之前在一个软件培训学校 学了1年半,之后就来现在这家公司了,工作也快3年了,平时用的是asp.net mvc 来开发 公司的系统,现在觉得当时学了一大堆东西,随着时间的流逝,平时工作中又不怎么用的话,所有学的东西 会全部忘掉一干二净,这几年来,不能说一点没进步,但是最基本 最基本的东西 全部都遗忘了,其实 做web开发,要看具体公司的业务 用到的技术,感觉我们公司用到的技术不是很多,反正我现在是感觉 自己这3年来,浪费了太多的时间,颓废的一塌糊涂,为了工作而工作,没有想过以后,或者全面的提升自己的水平,认为有个工作就行了,把工作做好了就够了,错 大错特错...一定要时时刻刻提高自己,编程这东西 就是要细心 稳重,有时候别看基础 很简单,其实真正能搞懂 ,真正深入的去理解 你才能进步 才能在日后的工作中 有很大帮助... 所以 我今天开始 准备好好的重新 系统的学习下 深入理解c# 第2版,因为是 翻译的,我会用我懂的 和理解的 去把代码的 意思更通俗的去写出来.. 首先说下,我这个人呢 写东西比较随便 可能外观样式上面 不怎么好看,我写的目的 第一就是 为了让自己学习的过程中 还能自己总结下,第二就是 能够让大家一起去学习 去分享经验。好的 开始吧 擦 ..

1.1.1  c#1 中定义的产品类型

大家知道,当年我没搞懂的时候 感觉很奇怪,很困惑,觉得 定义一个对象 居然有很多种方式,搞得不知道有时候 使用什么方法来定义..

c#1中 是这样定义一个对象的:

代码1-1

   public class Product

    {



       string name;

       public string Name { get { return name; } }



       decimal price;

       public decimal Price { get { return price; } }



       public Product(string name, decimal price)

       {

           this.name = name;

           this.price = price;

       }

       public static ArrayList GetSampleProduct()

       {

           ArrayList list = new ArrayList();



           list.Add(new Product("West Side Story", 9.99m));

           list.Add(new Product("Assassins", 14.99m));

           list.Add(new Product("Frogs", 13.99m));

           list.Add(new Product("Sweeney", 10.99m));

           return list;

       }

       public override string ToString()

       {

           return string.Format("{0}:{1}", name, price);

       }

    }

代码1-1 是c# 1代码,但是它存在3个局限.

(1).ArrayList 没有提供编译时信息,就是说 你如果在1-1代码中的ArrayList 里面添加一个字符串也是可以的,那么就会乱了,类型不一致了,到时候显示的时候调用重写的ToString()就会报错了.

(2).1-1代码中为属性提供了公共的取值方法,这意味着如果添加对应的赋值方法,那么赋值方法也必须是公共的。(这句话是书上的,我不是很理解...赋值属性完全可以是 私有的,可能作者不是这个意思吧)

(3).其实这种 很早之前的封装一个字段的做法 很麻烦,现在一般都是用 自动实现属性,代码很简洁,而且全部都用的是属性,保持了一致性..

修改下上面的代码:

 public class Product

    {



       string name;

       public string Name

       {

           get { return name; }

           private set { name = value; }

       }





       decimal price;

       public decimal Price

       {

           get{return price;}

           private set { price = value; }

       }

public Product(string name, decimal price)

       {

           Name = name;

           Price = price;

       }

       public static List<Product> GetSampleProduct()

       {

           List<Product> list = new List<Product>();



           list.Add(new Product("West Side Story", 9.99m));

           list.Add(new Product("Assassins", 14.99m));

           list.Add(new Product("Frogs", 13.99m));

           list.Add(new Product("Sweeney", 10.99m));

           return list;

       }

       public override string ToString()

       {

           return string.Format("{0}:{1}", name, price);

       }



    }

c# 2中的强类型集合 也就是泛型 来强制类型统一,泛型 有很多好处,比如 增加了安全性,提高了效率 避免了 装箱 拆箱 等等..

还有增加了 私有赋值的方法,只能在类内部对属性赋值或者改变. 很多时候我们都会 这样去用,比如 我的类的某些属性,不允许别人更改.. 只能初始化,初始化后就不能更改.上面代码Name 和Price就是这样的.

还有构造函数里面之前用的是 字段,现在改成用属性了,更加直观了。

 

那么c# 3中增加了 自动实现属性,初始化属性  不用前面那么复杂了,修改下代码:

   public class Product

    {



       public string Name { get; private set; }

       public decimal Price { get;private set; }

        



       public Product(string name, decimal price)

       {

           Name = name;

           Price = price;

       }

       Product() { } public static List<Product> GetSampleProduct()

       {



            return new List<Product> { 
            new Product{Name="West Side Story", Price= 9.99m},
            new Product{Name="Assassins", Price=14.99m},
            new Product{Name="Frogs", Price=13.99m},
            new Product{Name="Sweeney", Price=10.99m}
           };
}
public override string ToString() { return string.Format("{0}:{1}", Name, Price); } }

改过之后,我觉得 现在没有之前name 和price 变量了,那么在外部别人使用的时候全部都是用的属性,这样增强了一致性,可读性 是吧。而且 初始化List<Product>时 不再像之前那样 用构造函数的方式传参了,而是直接对属性进行赋值来构建,但是这只能是在内部的 你要是在外面 这样初始化 绝对报错,  别忘记了 我们还有构造函数呢,Product product = new Product("pen", 10m);

还有这段代码 里面其实 增加了Product() { } 无参构造函数,因为  写了有参构造函数会默认 屏蔽 无参构造函数,那么我们要 new Product{Name="West Side Story", Price= 9.99m}构建对象,调用的其实是无参 构造函数. 但这里是 私有的 无参构造函数,外面只能用有参构造函数..说的有点乱 嘿嘿

 最后还有一个c#4中新加的 命名实参.

先看代码

    public class Product

    {



        readonly string name;



        public string Name { get { return name; } }



        readonly decimal price;

        public decimal Price { get { return price; } }





        public Product(string name, decimal price)

        {

            this.name = name;

            this.price = price;

            

        }



        public static List<Product> GetSampleProduct()

        {



            return new List<Product> { 

            new Product(name:"West Side Story",price:9.99m),

            new Product(name:"Assassins",price:14.99m),

            new Product(name:"Frogs",price:13.99m),

            new Product(name:"Sweeney",price:10.99m)

           };

        }

        public override string ToString()

        {

            return string.Format("{0}:{1}", Name, Price);

        }



    }

这个特性就是为了当方法或者构造函数包含多个参数时,能使代码的含义更加清楚,特别是当参数类型相同,或者某个参数为null或默认值的时候;

比如上面的构造函数修改下

        readonly string name;



        public string Name { get { return name; } }



        readonly decimal price;

        public decimal Price { get { return price; } }



        readonly int age; public Product(string name,int age=0, decimal price)

        {

            this.name = name;

            this.price = price;

            this.age = age;

        }


那么初始化时候是这样的 new Product(name:"West Side Story",price:9.99m); ,如果不用命名实参的方式用以往的顺序来的话就报错了new Product("West Side Story",9.99m);

只在让代码更好理解的时候才指定参数的名称,还有就是上面说到的 null 或者默认值的时候。

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(C#)