之前两篇文档讲述了C#中的面向对象的概念,其实这个概念对于很多种语言都是通用的,只不过每种语言具体实现的过程方法不一样,比如Java、C++、python等,这些都是很流行的面向对象的语言在编程语言排行榜中都是属于前几名的。面向对象中比较难以理解的就是多态的概念,多态我将留到后面的章节去讲,现在继续先学习好基本的一些语法理解好语意才能更好的理解。

数组
数组顾名思义就是一组同类数据元素的集合,数组不单单是数字的集合,可以是多种类型的,但是集合中元素必须是同一种数据类型,那么什么是同类数据的元素呢?在第一篇中有介绍C#中15中最常用的数据类型(类型还可以自己扩展),每种类型有最大值最小值,每一个值就相当于是一个元素了,打个比如int类型的数组那就只可以存储int的类型的元素,如果在int类型中存储string类型,那么编译器或报错,数组在C#中是最早出现的,在内存中是连续存储的,所以它的索引速度非常快,下面来看一下如果声明一个数组。

这里使用int类型:

   //创建一个大小为3的数组

     int[] intArray = new int[];

     //赋值

     intArray[] = ;

     intArray[] = ;

     intArray[] = ;

     //修改

   intArray[]=;

但是在数组中存在一些不足的地方,比如在数组的两个数据之间插入数据是很麻烦,在插入数组后面的所有元素都要往后退一位,而且在声明数组的时候必须指定数组的长度,数组的长度过长,会造成内存的浪费,过长也会造成数据溢出的错误,针对数组的这些缺点,又推出了ArrayList对象来克服这些缺点。

ArrayList

在命名空间System.Collection中,ArrayLis存储的对象元素是动态去分配的,根据需求去进行相应的扩容和收缩空间,所以在声明ArrayLis对象时并不需要去指定它的长度。

 //声明一个ArrayList对象
ArrayList arrayList = new ArrayList(); //新增数据
arrayList.Add();
arrayList.Add("Leon"); //修改数据
arrayList[] = ; //删除
arrayList.Remove(); //插入数据
arrayList.Insert(, );

从上面的例子中ArrayList好像是解决上面数组遗留下来的问题,当时当你实际编译的时候就会遇到异常了,如果有在编译器上实习输入代码编译的同学会发现,arrayList.Add( )这个方法接受的是一个object的类型,那么当我在arrayList[0],这个位置赋值的时候就会出现一个装箱拆箱所带来的性能损耗,而且在我第二次使用Add时插入的是一个string类型的变量,那么同一个数组中出现两种不一样的数据类型,并且在编译的时候是正常的,所以在编译时不能检查类型,在运行中就会出现错误。装箱拆箱实际上就是object类型和其它类型之间的数据转换所带来的性能损耗,具体过程可以在网上查下资料。

泛型List

因为ArrayList存在不安全类型与装箱拆箱的缺点,所以后面微软又推出了泛型,List类和ArrayList类的用法相似,但是最关键的地方在于 List声明集合的时候必须要指定数据对象的类型。

 //声明List集合对象
List<string> listString = new List<string>(); //增加
listString.Add("leon"); //修改
listString[] = "newLeon"; //删除数据
listString.RemoveAt();

这里可以看到,List和ArrayList的用法差不多,区别就在于List在声明的时候必须要指定数据对象的类型,这样如果尝试在listString中插入int类型的值编译器就会报错,在编译时就可以避免一个类型安全的问题,和装箱拆箱带来的性能损耗。

小结:

数组的存储容量是固定的,每次只能对一个值去进行操作,而且在两个值之间插入一个元素的话很麻烦,不方便操作。

ArrayList中虽然定义好的一套方法可以很方便的去操作数组,很好的删除、插入元素,但是由于装箱拆箱的过程会浪费很多资源,而且编译时没有提供一个安全类型的检查,使得在一个有int类型的数组中允许插入其它类型的,比如string,这样虽然在编译时不会报错,但是在运行时会发生异常。

泛型List,泛型int类型是强类型,在编译时会检查类型,并且减少装箱拆箱带来的损耗。

这里注意数组可以是多维度的但是,ArrayList和List始终只具有一个维度。

C#基础知识-数组_ArrayList_List(九)的更多相关文章

  1. C语言基础知识-数组和字符串

    C语言基础知识-数组和字符串 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.数组概述 在程序设计中,为了方便处理数据把具有相同类型的若干变量按有序形式组织起来的方式我们称为数组 ...

  2. [C# 基础知识系列]专题九: 深入理解泛型可变性

    引言: 在C# 2.0中泛型并不支持可变性的(可变性指的就是协变性和逆变性),我们知道在面向对象的继承中就具有可变性,当方法声明返回类型为Stream,我们可以在实现中返回一个FileStream的类 ...

  3. java 基础知识-数组的7种算法(排序、求和、最值、遍历...)

    遍历 遍历就是把这个数组的每个元素 显示出来 遍历的方法就是先定义这个数组的大小,然后用FOR循环来完成数组,例如 double[] score = new double[5]; Scanner in ...

  4. javascript基础知识-数组

    1.javascript创建数组时无需声明数组大小或者在数组大小变化时重新分配 2.javascript数组是无类型的 3.数组元素不一定要连续 4.针对稀疏数组,length比所有元素的索引都要大 ...

  5. Java基础知识学习(九)

    GUI开发 先前用Java编写GUI程序,是使用抽象窗口工具包AWT(Abstract Window Toolkit).现在多用Swing.Swing可以看作是AWT的改良版,而不是代替AWT,是对A ...

  6. java基础知识—数组

    1.数组:是一个变量,存储相同数据类型的一组数据. 2.数据的优点:减少代码量.易查找. 3.数组的使用步骤: 1)声明数组:int scores []: 2)开辟空间:scores = new in ...

  7. PHP 基础知识-数组

    PHP 的数组主要分为: 索引数组 - 带有数字索引的数组 关联数组 - 带有指定键的数组 多维数组 - 包含一个或多个数组的数组   索引数组:   有两种创建索引数组的方法: 索引是自动分配的(索 ...

  8. javaScript 基础知识汇总(九)

    1.Rest 参数 与 Spread 操作符 当我们在代码中遇到“..."时,它不是Rest参数就是Spread操作符 区分方法: 若...出现在函数的参数列表,那它表示的就是Rest参数, ...

  9. JAVA基础知识总结:九

    二.面向对象特性之继承 1.什么是继承? 如果两个或者两个以上的类具有相同的属性和方法,我们可以抽取一个类出来,在抽取出来的类中声明各个类中公共的部分 被抽取出来的类-------父类,基类,超类 两 ...

随机推荐

  1. 【转】C# String 与 Char[] 数组 相互转换

    源地址:http://blog.csdn.net/razilfelix/article/details/52289663 string 转换成 Char[] string ss = "abc ...

  2. adminlte+layui框架搭建3 - layui弹出层

    在amdinlte首页引入layui.js 和layui.css后添加代码 <script> layui.use(['layer'], function () { var layer = ...

  3. vue 利用 v-model 实现 双向传递数据..

    注意 <input type='hidden' :value='value'/> 变量名必须 是 value--- 不能叫其他名字++

  4. php session_id() session_name()

    1.Session.use_cookies:默认值为"1",代表SessionID使用Cookie来传递,反之就是用Query_String来传递 2.Session.name:这 ...

  5. archlinux安装交叉编译工具链

    1. 在/usr/local下新建文件夹:arm  [guo@archlinux local]$sudo mkdir arm 2. 将交叉编译工具拷贝到arm文件夹中  [guo@archlinux ...

  6. ASP.Net Core 发布ABP项目遇到的错误

    1.HTTP 错误 500.19 - Internal Server Error 无法访问请求的页面,因为该页的相关配置数据无效. 与ASP.NET时代不同,ASP.NET Core不再是由IIS工作 ...

  7. PIE SDK傅里叶变换

    1.算法功能简介 傅里叶变换能把遥感图像从空域变换到只包含不同频域信息的频域中.原图像上的灰度突变部位(如物体边缘).图像结构复杂的区域.图像细节及干扰噪声等,经傅里叶变换后,其信息大多集中在高频区: ...

  8. c++读取list.txt中每行的字符串以及写入二进制文件

    #include <fstream> #include <fstream> string path = ""; FILE* fp = fopen(path. ...

  9. 使用 .NET Core CLI 创建 .NET Core 全局工具

    https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=2&ch=&tn=baiduhome_pg& ...

  10. spark第四篇:Running Spark on YARN

    确保HADOOP_CONF_DIR或者YARN_CONF_DIR指向hadoop集群配置文件目录.这些配置用来写数据到hdfs以及连接yarn ResourceManager.(在$SPARK_HOM ...