这篇文章主要通过演示类在不同发展中的不通过定义方法,来向读者表述它们之间的区别和联系。

在C#1时代,我们喜欢这样定义类:

  1. public class Product
  2. {
  3. private string _name;
  4. public string Name {
  5. get { return _name; }
  6. }
  7.  
  8. private decimal _price;
  9. public decimal Price
  10. {
  11. get { return _price; }
  12. }
  13.  
  14. public Product(string name, decimal price)
  15. {
  16. this._name = name;
  17. this._price = price;
  18. }
  19.  
  20. public static ArrayList GetArrayList()
  21. {
  22. ArrayList list = new ArrayList();
  23. list.Add(new Product("WindowsPhone", 10m));
  24. list.Add(new Product("Apple", 10m));
  25. list.Add(new Product("Android", 10m));
  26.  
  27. return list;
  28. }
  29.  
  30. public override string ToString()
  31. {
  32. return String.Format("{0}--{1}", _name, _price);
  33. }
  34. }

局限性:
1、ArrayList没有提供与其内部内容有关的编译时信息,如果不慎写错,编译器也不会出现任何提示;

2、代码中为属性提供了公共的取值方法,这意味着如果添加对应的赋值方法,那么赋值方法必须是共有的;

3、用于创建属性和变量的代码很复杂,这违背了我们进行封装的原本意愿;

在C#2时代,我们喜欢这样定义类:

  1. public class Product
  2. {
  3. private string _name;
  4. public string Name {
  5. get { return _name; }
  6. private set { _name = value; }
  7. }
  8.  
  9. private decimal _price;
  10. public decimal Price
  11. {
  12. get { return _price; }
  13. private set { _price = value; }
  14. }
  15.  
  16. public Product(string name, decimal price)
  17. {
  18. Name = name;
  19. Price = price;
  20. }
  21.  
  22. public static List<Product> GetArrayList()
  23. {
  24. List<Product> list = new List<Product>();
  25. list.Add(new Product("WindowsPhone", 10m));
  26. list.Add(new Product("Apple", 10m));
  27. list.Add(new Product("Android", 10m));
  28.  
  29. return list;
  30. }
  31.  
  32. public override string ToString()
  33. {
  34. return String.Format("{0}--{1}", Name, Price);
  35. }
  36. }

现在,属性拥有了私有的赋值方法,并且它能非常聪明的“猜出”List<Product>是告知编译器列表中只能包含Product。试图将一个不同类型添加到列表中会造成编译时错误,并且当你从列表中获取结果时,也并不需要转化结果的类型;有效的解决了C#1中的前两个问题;

在C#3时代,我们喜欢这样定义类:

  1. public class Product
  2. {
  3. public string Name
  4. {
  5. get; private set;
  6. }
  7.  
  8. public decimal Price
  9. {
  10. get; private set;
  11. }
  12.  
  13. public Product(){}
  14.  
  15. public static List<Product> GetArrayList()
  16. {
  17. return new List<Product>()
  18. {
  19. new Product {Name = "WindowsPhone", Price = 10m},
  20. new Product {Name = "Apple", Price = 10m},
  21. new Product {Name = "Android", Price = 10m}
  22. };
  23. }
  24.  
  25. public override string ToString()
  26. {
  27. return String.Format("{0}--{1}", Name, Price);
  28. }
  29. }

发展到这个阶段,我们可以很明显的发现,不再有任何代码(或者可见的变量)与属性关联,而且硬编码的列表是以一种全然不同的方式构建,这样一来,我们实际上是完全可以删除就有的构造函数,但是外部代码就不能再创建其他的产品实例。自动熟悉大大简化了操作;

在C#4时代,我们喜欢这样定义类:

  1. public class Product
  2. {
  3. private readonly string _name;
  4.  
  5. public string Name
  6. {
  7. get { return _name; }
  8. }
  9.  
  10. private readonly decimal _price;
  11.  
  12. public decimal Price
  13. {
  14. get { return _price; }
  15. }
  16.  
  17. public Product(string name,decimal price)
  18. {
  19. this._name = name;
  20. this._price = price;
  21. }
  22.  
  23. public static List<Product> GetArrayList()
  24. {
  25. return new List<Product>()
  26. {
  27. new Product(name: "WindowsPhone", price: 10m),
  28. new Product(name: "Apple", price: 10m),
  29. new Product(name: "Android", price: 10m)
  30. };
  31. }
  32.  
  33. public override string ToString()
  34. {
  35. return String.Format("{0}--{1}", Name, Price);
  36. }
  37. }

在这个特定的示例中,C#4的特性的好处还不是很明显,但当方法或构造函数包含多个参数时,它可以是代码的含义更加清-特别是当参数类型相同,或某个参数为null时。当然,你可以选择什么时候使用该特性,只在是代码更好的理解时才指定参数的名称;

总结:

C#1(只读属性,弱类型集合)------》C#2(私有属性赋值方法,强类型集合)------》C#3(自动实现的熟悉,增强的集合和对象初始化)------》C#4(用命名实参更清晰的调用构造函数和方法)

注:由于C#5在这方面的特性表现的没有太大变化,所以就不再表述。

如果你觉得这篇文章对你有所帮助,欢迎转载,但请注明出处!

C#特性之数据类型的更多相关文章

  1. Redis入门教程:特性及数据类型的操作

    虽然Redis已经很火了,相信还是有很多同学对Redis只是有所听闻或者了解并不全面,下面是一个比较系统的Redis介绍,对Redis的特性及各种数据类型及操作进行了介绍.是一个很不错的Redis入门 ...

  2. Java新特性:数据类型可以扔掉了?

    在很久很久以前,我们写代码时要慎重的考虑变量的数据类型,比如下面这些: 枚举:尽管在 JDK 5 中增加了枚举类型,但是 Class 文件常量池的 CONSTANT_Class_info 类型常量并没 ...

  3. python语言特性及其数据类型

  4. Oracle 12C 新特性之扩展数据类型(extended data type)

    Oracle 12C 新特性-扩展数据类型,在12c中,与早期版本相比,诸如VARCHAR2, NAVARCHAR2以及 RAW这些数据类型的大小会从4K以及2K字节扩展至32K字节.只要可能,扩展字 ...

  5. 2.python数据类型

    1 Number(数字) 2   字符串类型(string)   字符串内置方法 # string.capitalize() 把字符串的第一个字符大写 # string.center(width) 返 ...

  6. 基于 Algebird 谈一谈代数数据类型在数据聚合中的应用

    此文已由作者肖乃同授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 代数数据类型是指满足一定数学特性的数据类型, 这些特性使得计算能够很方便的并行化,在Scalding和  S ...

  7. mysql8.0 新特性,对json类型的常用操作

    mysql8 新特性-json数据类型操作 -- 根据key(可多个)获取value SELECT JSON_EXTRACT('{"id": 14, "name" ...

  8. ASP.NET Core 中文文档 第二章 指南(4.6)Controller 方法与视图

    原文:Controller methods and views 作者:Rick Anderson 翻译:谢炀(Kiler) 校对:孟帅洋(书缘) .张仁建(第二年.夏) .许登洋(Seay) .姚阿勇 ...

  9. Python之路3【第一篇】Python基础

    本节内容 Python简介 Python安装 第一个Python程序 编程语言的分类 Python简介 1.Python的由来 python的创始人为吉多·范罗苏姆(Guido van Rossum) ...

随机推荐

  1. cf 700e(sam好题,线段树维护right)

    代码参考:http://blog.csdn.net/qq_33229466/article/details/79140428 #include<iostream> #include< ...

  2. 第三周Access的总结

    一.问;这节课你学到了什么知识? 答:这周我学得比较少,主要是学Access的数据库进行基本的维护. 2.3数据库的基本维护 对Access定期检查,修复是整个数据库重要部分: 1.Access可修复 ...

  3. 背水一战 Windows 10 (85) - 文件系统: 获取文件夹和文件, 分组文件夹, 排序过滤文件夹和文件, 搜索文件

    [源码下载] 背水一战 Windows 10 (85) - 文件系统: 获取文件夹和文件, 分组文件夹, 排序过滤文件夹和文件, 搜索文件 作者:webabcd 介绍背水一战 Windows 10 之 ...

  4. 阿里开源项目arthas在docker环境初始化

    需求 我前一篇是在window环境下做的测试,实际情况现在的生成环境程序都部署在了docker环境下,此环境对arthas可能会缺失很多必要组件 目前的基础环境是在docker容器中,只存在基本的to ...

  5. spring-boot(hello world)

    重拾程序,想不到从java开始,最近两周开搞web,从基本框架开始,仅做个人学习记录,遗漏之处望请海涵. 1.基本准备 开发环境win7: IDE  myeclipse Version: 2017 C ...

  6. Testing - 软件测试知识梳理 - 比较质量保证(QA)与质量控制(QC)

    QA QC QM 概念 Quality Assurance (质量保证) Quality Control (质量控制) Quality Manage (质量管理) 定义 为达到质量要求所采取的作业技术 ...

  7. 配置redis

    配置Redis 配置相关redis.conf bind 127.0.0.1                                                 注释掉 否则其它远程计算机无 ...

  8. Java访问文件夹中文件的递归遍历代码Demo

    上代码: import java.io.File; /* * 需求:对指定目录进行所有内容的列出(包含子目录中的内容) * 也可以理解为 深度遍历. */ public class FindAllFi ...

  9. quartz配置参数org.quartz.jobStore.misfireThreshold含义解释

    配置定时任务参数 quartz.properties文件时 需要配置jobStore的超过时间数 默认为60秒(这里单位为毫秒) org.quartz.jobStore.misfireThreshol ...

  10. zmq setsockopt()

    zmq.RCVTIMEO:在一个recv操作返回EAGAIN错误前的最大时间 设置socket的接收操作超时时间.如果属性值是0,zmq_recv(3)函数将会立刻返回,如果没有接收到任何消息,将会返 ...