深入理解C#:从简单的数据类型开始

来源:互联网 发布:差不多先生 知乎 编辑:程序博客网 时间:2024/05/21 09:14
工作上用了c#有好几年了,其实对于c#版本傻傻的分不清楚,所以觉得有必要对c#的用法和理解的层面上再进一步。

希望通过写博客,把自己看书的理解直接体现出来,当时没理解,也能在这里做个记录,以后往回看也是可以的嘛。




  • C#1 中定义的产品类型       
class Product1{ //c#1string name;decimal price;public string Name{get{ return name;}//c#1,已经设置了获取变量方法,要想设置赋值变量,set必须是public}public decimal Price{ //创建变量的代码太复杂,封装应该是非常简单的任务get{ return price;}}public Product1(string name,decimal price){this.name = name;this.price = price;}public static ArrayList GetSampleProducts(){ArrayList al = new ArrayList ();//ArrayList没有提供与其内部内容相关的编译时的信息,一不小心增加个字符串信息也是很有可能的,而且编译器还不会报错//al.Add ("abc"); //如果没有注释,该句还是会通过编译al.Add (new Product1("West Side Story",9.99m));al.Add (new Product1("Assassins",14.99m));al.Add (new Product1("Frogs",13.99m));al.Add (new Product1("Sweeney Todd",10.99m)); return al;}public override string ToString (){return string.Format ("[Product1: Name={0}, Price={1}]", name, price);}}

总结:1.Product类中,Name,Price是只读属性,要想改变字段name,price的话,要通过Product(name,price)构造函数来改变咯。
           2.Product类中,ArrayList是弱类型集合,对于加入的类型无限制,这才造成误操作,而且在运行的时候或者单元测试才会被发现,编译器在编译时是不会发现的
           3.我学习C#的时候应该是c#3,4之间,原来C#1也有这么个过程,就像我们学习过程,看回以前自己写的代码,会发出“tnnd,这是谁写的代码?”的感叹啊。

  • C#2 强类型集合,私有属性赋值
class Product2{string name;decimal price;public string Name{get{ return name;}//c#1,已经设置了获取变量方法,要想设置赋值变量,set必须是publicprivate set{ name = value;}//c#2,设置set方法为private}public decimal Price{ //c#1,创建变量的代码太复杂,封装应该是非常简单的任务get{ return price;}private set{  price=value;}}public Product2(string name,decimal price){//this.name = name; //c#1,赋值到变量Name = name; //c#2,直接赋值到属性//this.price = price; Price = price; }public static List<Product2> GetSampleProducts(){//ArrayList al = new ArrayList ();//c#1,ArrayList没有提供与其内部内容相关的编译时的信息,一不小心增加个字符串信息也是很有可能的,而且编译器还不会报错//al.Add ("abc"); //c#1,如果没有注释,该句还是会通过编译List<Product2> al=new List<Product2>(); //c#2,强类型集合,妈妈再也不用担心我会加入乱七八糟的东西啦al.Add (new Product2("West Side Story",9.99m));al.Add (new Product2("Assassins",14.99m));al.Add (new Product2("Frogs",13.99m));al.Add (new Product2("Sweeney Todd",10.99m)); return al;}public override string ToString (){return string.Format ("[Product2: Name={0}, Price={1}]", name, price);}}

总结:1.C#2,属性的getter,setter终于有访问修饰符啦,果断private setter,构造函数直接赋值到属性啦。
           2.C#2,List<Product>告诉你,你别乱来啊,它在编译时就告诉编译器,列表中只能包含Product。

  • C#3 自动实现的属性,增加的结合,简化的对象初始化
class Product3{/*string name;decimal price;public string Name{get{ return name;}//c#1,已经设置了获取变量方法,要想设置赋值变量,set必须是publicprivate set{ name = value;}//c#2,设置set方法为private}public decimal Price{ //c#1,创建变量的代码太复杂,封装应该是非常简单的任务get{ return price;}private set{  price=value;}}public Product2(string name,decimal price){//this.name = name; //c#1,赋值到变量Name = name; //c#2,直接赋值到属性//this.price = price; Price = price; }*/public string Name{ get; private set;}public decimal Price{ get; private set;}public Product3(string name,decimal price){Name = name; Price = price; }public Product3(){}public static List<Product3> GetSampleProducts(){/*List<Product3> al=new List<Product3>(); //c#2,强类型集合,妈妈再也不用担心我会加入乱七八糟的东西啦al.Add (new Product3("West Side Story",9.99m));al.Add (new Product3("Assassins",14.99m));al.Add (new Product3("Frogs",13.99m));al.Add (new Product3("Sweeney Todd",10.99m)); return al;*/return new List<Product3>{new Product3{Name="West Side Stroy",Price=9.99m},new Product3{Name="Assassins",Price=14.99m},new Product3{Name="Frogs",Price=13.99m},new Product3{Name="Sweeney Todd",Price=10.99m}};}public override string ToString (){return string.Format ("[Product1: Price={0}, account={1}]", Name, Price);}}

总结:1.封装属性的方法更加简便
           2.简化初始化
           3.虽然相比Lambda表达式来说,可能有点小儿科,但是也是减少很多公共的代码嘛

  • C#4 命名参数
class Product4{ //c#4readonly string name; //设置变量不可变,只读(只读属性,没有快捷方式)readonly decimal price;public string Name{get{ return name;}}public decimal Price{ get{ return price;}}public Product4(string name,decimal price){this.name = name;this.price = price;}public Product4(){}public static List<Product4> GetSampleProducts(){/*return new List<Product4>{new Product4{Name="West Side Stroy",Price=9.99m},new Product4{Name="Assassins",Price=14.99m},new Product4{Name="Frogs",Price=13.99m},new Product4{Name="Sweeney Todd",Price=10.99m}};*/return new List<Product4> {new Product4(name:"West Side Stroy",price:9.99m),//使用命名参数new Product4(price:14.99m,name:"Assassins"),new Product4(name:"Frogs",price:13.99m),new Product4(name:"Sweeney Todd",price:10.99m)};}public override string ToString (){return string.Format ("[Product1: Name={0}, Price={1}]", name, price);}}

总结:1.为了让类的私有化属性不能公开地改变,只读属性只能通过以上方式定义
           2.然而因为只读属性,那么只能通过调用构造方式来初始化了。
           3.书中例子使用以上例子来说明C#4的新特性命名参数有些牵强了,或许,拿默认参数和命名参数来举例会更好,当参数出现多个,并且类型相同或有一个参数为null的时候,效果更明显。

1 0
原创粉丝点击