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

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

public class Product
{
private string _name;
public string Name {
get { return _name; }
} private decimal _price;
public decimal Price
{
get { return _price; }
} public Product(string name, decimal price)
{
this._name = name;
this._price = price;
} public static ArrayList GetArrayList()
{
ArrayList list = new ArrayList();
list.Add(new Product("WindowsPhone", 10m));
list.Add(new Product("Apple", 10m));
list.Add(new Product("Android", 10m)); return list;
} public override string ToString()
{
return String.Format("{0}--{1}", _name, _price);
}
}

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

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

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

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

public class Product
{
private string _name;
public string Name {
get { return _name; }
private set { _name = value; }
} private 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> GetArrayList()
{
List<Product> list = new List<Product>();
list.Add(new Product("WindowsPhone", 10m));
list.Add(new Product("Apple", 10m));
list.Add(new Product("Android", 10m)); return list;
} public override string ToString()
{
return String.Format("{0}--{1}", Name, Price);
}
}

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

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

public class Product
{
public string Name
{
get; private set;
} public decimal Price
{
get; private set;
} public Product(){} public static List<Product> GetArrayList()
{
return new List<Product>()
{
new Product {Name = "WindowsPhone", Price = 10m},
new Product {Name = "Apple", Price = 10m},
new Product {Name = "Android", Price = 10m}
};
} public override string ToString()
{
return String.Format("{0}--{1}", Name, Price);
}
}

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

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

public class Product
{
private readonly string _name; public string Name
{
get { return _name; }
} private 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> GetArrayList()
{
return new List<Product>()
{
new Product(name: "WindowsPhone", price: 10m),
new Product(name: "Apple", price: 10m),
new Product(name: "Android", price: 10m)
};
} public override string ToString()
{
return String.Format("{0}--{1}", Name, Price);
}
}

在这个特定的示例中,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. 运行第一个Python程序

    Python的三种运行方式 交互式解释器 在终端输入python3 进入python交互式解释器 输入exit()退出交互式解释器 命令行脚本 创建python脚本 通过命令执行程序 python h ...

  2. cf 20C Dijkstra?

    带队列  dijkstra #include <iostream> #include <cstdio> #include <queue> #include < ...

  3. Ocelot使用

    1.在网关项目中通过nuget引入Ocelot 2.Startup.cs文件代码调整 using System; using System.Collections.Generic; using Sys ...

  4. 2017CS231n学习笔记——计算机视觉的概述

    本节课主要讲述了cs231n课程的背景和计算机视觉的历史,也主要介绍了目前很重要的一个计算机视觉数据集--IMAGENET. 更多内容参考我的AI学习之路 课程简介 这门课程是由stanford大学计 ...

  5. IPv6技术详解:基本概念、应用现状、技术实践(上篇)

    本文来自微信技术架构部的原创技术分享. 1.前言 普及IPV6喊了多少年了,连苹果的APP上架App Store也早已强制IPV6的支持,然并卵,因为历史遗留问题,即使在IPV4地址如果饥荒的情况下, ...

  6. Java 数组的创建

    与C.C++不同,Java在定义数组时并不为数组元素分配内存,因此[ ]中无需指定数组元素的个数,即数组长度. 定义一个数组有两种方式: int[] array; int array[]; 对于如上定 ...

  7. 前端学习之路-CSS介绍,Html介绍,JavaScript介绍

    CSS介绍 学前端必备掌握CSS样式,css为层叠样式表,用来定义页面的显示效果,加强用户的体验乐趣,那么如何用css到html中呢? style属性方式 利用标签中的style属性来改变显示样式 & ...

  8. JavaScript学习之路-语法

    版权声明:未经博主允许不得转载 在JavaScript中如何写语法呢?这里你可以去看一些教学文档来得快一些,这里不介绍,有点基础的也可以复习一下. //定义变量并赋值 var a; //定义变量 va ...

  9. LabVIEW(十):数组和簇

    一.数组 1.创建数组 (1).前面板右键>“数组.矩阵与簇”>数组. (2).前面板右键>(选择要添加的数组数据类型,比如创建数值数组)数值>将“数值输入控件”拖入数组中. ...

  10. Linux下MySQL的简单操作

    Linux下MySQL的简单操作 更改mysql数据库root的密码 首次进入数据库是不用密码的: [root@localhost ~]# /usr/local/mysql/bin/mysql -ur ...