深入理解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);}}
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);}}
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
- 深入理解C#:从简单的数据类型开始
- C#开发的进化史(从简单的数据类型开始)
- 先从简单的开始
- 从简单的三角形开始
- 第一章 C#开发的进化史:1.1从简单的数据类型开始
- 从简单的一个函数开始
- 调试应该从简单的环境开始
- 解读(二):从简单的类开始
- 从简单问题开始
- 理解神经网络,从简单的例子开始(1)7行python代码构建神经网络
- 理解神经网络,从简单的例子开始(2)使用python建立多层神经网络
- worldwind 从简单开始 CardLayoutUsage
- 1.5.2.1 从简单开始
- Working Practice-从简单的工作开始
- 初学php,从简单可见的对象开始
- Shiro介绍(二):从简单的认证开始
- 那就从简单的系统引导开始吧
- Kernel Methods (1) 从简单的例子开始
- 跨平台时基于数据结构的网络通信
- windows分层过滤驱动再理解
- 基础知识复习
- __attribute__ ((packed)) 的作用
- 技术不牛如何才拿到国内IT巨头的Offer
- 深入理解C#:从简单的数据类型开始
- 无法显示此网页
- 记gcc/g++对于sizeof的一个差异
- MATLAB中无法读取图像或无法打开文件等类似问题
- openstack安装部署之Nova
- 毕设第三周(Pregel in GraphX以及Shortest Path)
- 学习笔记七之网络编程(TCP)
- 安装qemu
- CSS+DIV之1-10