之前两篇文档讲述了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. hive的安装与配置 mysql安装 启动

    三种模式 内嵌模式:元数据保持在内嵌的derby模式,只允许一个会话连接 本地独立模式:在本地安装Mysql,吧元数据放到mySql内 远程模式:元数据放置在远程的Mysql数据库 1.下载Hive安 ...

  2. VINS-Mono Installation

    Prerequisites 1.1 ** Ubuntu 16.04, ROS Kinetic ** sudo apt-get install ros-kinetic-cv-bridge ros-kin ...

  3. 【ARC083E】Bichrome Tree 树形dp

    Description 有一颗N个节点的树,其中1号节点是整棵树的根节点,而对于第ii个点(2≤i≤N)(2≤i≤N),其父节点为PiPi 对于这棵树上每一个节点Snuke将会钦定一种颜色(黑或白), ...

  4. 洛谷P3355 骑士共存问题(最小割)

    传送门 de了两个小时的bug愣是没发现错在哪里……没办法只好重打了一遍竟然1A……我有点想从这里跳下去了…… 和方格取数问题差不多,把格子按行数和列数之和的奇偶性分为黑的和白的,可以发现某种颜色一定 ...

  5. c++继承构造析构调用原则以及特殊变量处理

    一.继承中的构造析构调用原则 1.子类对象在创建时会首先调用父类的构造函数 2.父类构造函数执行结束后,执行子类构造函数 3.当父类构造函数有参数时,需要在子类的初始化列表中显示调用: 4.析构函数调 ...

  6. ansible基本模块-command

  7. flask_restful

    from flask_restful import (Resource, reqparse) # 参数解析对象生成 parser = reqparse.RequestParser() parser.a ...

  8. ProgressBar(进度条)、SeekBar(拖动条)与星级评分条(RatingBar)

    1.ProgressBar(进度条) (1)介绍 (2)常用属性 (3)xml代码 <ProgressBar android:id="@+id/progressBar2" s ...

  9. 【算法笔记】B1032 挖掘机技术哪家强

    1032 挖掘机技术哪家强 (20 分) 为了用事实说明挖掘机技术到底哪家强,PAT 组织了一场挖掘机技能大赛.现请你根据比赛结果统计出技术最强的那个学校. 输入格式: 输入在第 1 行给出不超过 1 ...

  10. P4174 [NOI2006]最大获利

    传送门 把用户群和中转站都看成点 用户群权值为正,中转站权值为负 为了获得用户群的权值,我们不得不一起获得中转站负的权值 发现就是裸的最大权闭合子图 那么从用户群连边向中转站,边值INF 从 S 连向 ...