复杂数据类型
1.概述
普通数据类型:
无符号变量:byte、ushort、uint、ulong
有符号变量:sbyte、short、int、long
浮点数:float、double、decimal
特殊类型:bool、char、string
复杂数据类型:
数据集合:一般是由多个数据或者变量集合在一起构成
自定义数据:一般是自己可以取名字并且可以自定义的数据
类型特点:
枚举:整形常量的集合,可以自定义
数组:任意变量类型顺序存储的数据
结构体:任意变量的数据集合,可以自定义
2.枚举
枚举是一个很特别的存在,它是一个被命名的整型常量的集合,我们一般用它来表示状态、类型等等。
申明枚举和申明枚举变量不同,申明枚举相当于创建一个自定义的枚举类型。而申明枚举变量是使用申明的自定义枚举类型来创建一个枚举变量
枚举大多与条件分支语句配合使用,比如switch,if ...else...等等。枚举可在namespace语句块或者class语句块或者struct语句块中申明,但一般都在namespa中申明,切记不可在函数语句块中申明。申明枚举时,枚举名应以E或者E_开头,定义枚举名时,如果不赋值,第一个枚举项的默认值为0,然后依次累加。
枚举可以与int类型和string类型相互转换,但是不可强行转换,需要利用特殊方法进行转换。枚举在游戏开发中,可以帮助我们更加清晰的了解代码的内容,来了解代码的具体含义。
3.数组
数组时存储一组相同类型数据的集合,数组分为一维、多维、交错数组,一把情况我们将一维数组简称为数组。简单来讲,数组时一种用于存放同一类数据的容器。
数组(一维)的申明方式(所有的变量类型皆可申明为数组):
int[] array; array = new int[5]; int[] array = new int[5]; int[] array = new int[5]{1,2,3,4,5}; int[] array = new int[]{1,2,3,4,5}; int[] array = {1,2,3,4,5};
二维数组是使用两个索引来确定元素的数组,这两个索引可以理解为X轴和Y轴。二维数组一般用于存储矩阵,例如可以在控制台小游戏中使用二位数组来表示地图格子。
交错数组是数组的数组,每个维度的数量可以不相同。其中二维数组每行的列数相同,交错数组每行的列数可能不同。交错数组可以用来存储同一类型的确定行不确定列的数据。
值类型和引用类型:
值类型:整形、浮点数、char、bool、结构体
引用类型:string、数组(一维、二维、交错)、类
值类型在相互赋值时,将内容拷贝给了对方;而引用类型在相互赋值时,会让双方指向同一个值。值类型和存储类型存储在内存区域是不同的,存储方式也是不同的,这就导致了双方在使用上产生了区别:值类型存储在栈空间,由系统分配,自动回收,数据量小,传输速度快;而引用类型存储在堆控件,需要手动申请和释放,数据量大,传输速度慢。
string虽然属于引用类型,但是它在拷贝内容时,和值类型相同。因为在C#中,string具备了值类型的特征。虽然string使用比较方便,但是在改变string时需要频繁的赋值,会产生大量的内存垃圾。
4.函数
函数也称方法,函数的本质时一块具有名称的代码块,可以使用函数的名称来执行这一代码块。函数通常用于封装代码,提升代码的复用率,也可以用于抽象行为。
函数我们一般用在class语句块或者strust语句块中,函数基本语法为:
static 返回类型 函数名(参数类型 参数名,参数类型 参数名,...) { 函数的代码逻辑; 函数的代码逻辑; ... return 返回值;(如果有返回类型才返回) }
语法要求:
1.static不是必须的;
2.返回类型需要引用一个新的关键字,返回类型可以写任意的变量类型;
3.函数名应当使用帕斯卡命名法命名,比如MyName;
4.参数不是必须的,参数的类型也可以任意类型,多个参数时需要用逗号隔开,而参数名需使用驼峰命名法命名,比如myName;
5.当返回值不是void时,需通过新的关键词,return返回对应类型的内容
即使函数没用返回值,我们也可以使用return,return可以直接不执行之后的代码,直接返回到函数外部。
ref和out作为函数的修饰符,都可以解决在函数内部改变外部传入的内容,令内部和外部内容都会发生变化。但是ref传入的变量必须初始化,而out不需要;out传入的变量必须在内部赋值,而ref不需要。ref和out在使用时只需要在申明函数的时候,前面加上ref和out的关键字即可。 关于变长参数params,params int[]表示后面可以放入N个int类型的参数,放入的参数会存放在array数组中。params在使用时,关键字后面必须为数组,并且这个数组可以是任意类型的数组。函数参数可以有别的参数和params关键字修饰的参数,但是函数参数中最多出现一个params关键字,并且一定是最后一组参数,但是它的前面可以有N个其他的参数。
有参数默认值的参数一般称为可选参数,可选参数的作用是:当调用函数时如果不放入参数,它会使用默认值来作为参数的值。每个参数都可以有默认值,但如果要混用的话,可选参数必须写在普通参数的后面。
在同一语句块中,函数名相同,参数的数量不同或参数的数量相同,参数的类型或顺序不同时,我们将他成为重载。重载可以命名一组功能相似的函数,减少函数名的数量,避免命名空间的污染,我们一般用来处理不同参数的同一类型的逻辑处理。重载和返回值的类型无关,只与参数类型,个数,顺序有关。调用时,程序会自己根据传入的参数类型来判断使用哪一个重载。
递归函数的概念就是让函数调用函数,当我们在使用递归函数时,需要设置结束调用的条件,并且该条件必须拥有令递归函数停止的功能。
5.结构体
结构体是一种自定义变量类型,类似于枚举,需要自己定义,定义时需使用帕斯卡命名法来命名。它是数据和函数的集合,在结构体中,可以申明各种变量和方法,但是申明的变量不能直接初始化。变量类型可以是任意类型,但是不能包含自己的结构体。结构体通常用来表现存在关系的数据集合,比如用结构体来表现动物,人类等等。
修饰结构体中变量和方法通常使用public和private,public修饰的内容是公共的,可以被外部访问,而private修饰的变量是私有的,只能在内部使用,如果不加任何修饰的话,系统默认使用private。
结构体的构造函数没有返回值,且函数名必须与结构名相同。构造函数必须有参数,如果申明了构造函数,那么必须在其中对所有的变量数据进行初始化。构造函数一般用于在外部初始化数据。
6.排序
排序是计算机内经常进行的一种操作,其目的是将一组没有顺序的记录序列调整为有顺序的记录序列。在程序中,序列一般存储在数组中,所以排序的对象往往是数组。
排序最常用的方法是冒泡排序和选择排序。冒泡排序的基本方法可以概括为:两两相邻,不停比较,不停交换,比较N轮,直到排序完成。选择排序的基本方法可以概括为新建中间数据,一次比较,找出极大值和极小值,放入目标位置,比较N轮,直到排序完成。所有排序的最终目的大都是让最小或最大的数据到数据的最前端,从而使数据能够以一个规定的顺序排列起来。