将之前的笔记记录在博客上

复杂数据类型

特点:数据(变量)集合、自定义;

枚举

枚举是一个被命名的整形常量集合,可以声明再命名空间、类和结构体中。

枚举声明

enum 变量名{
  名1,//枚举中默认是0下面累加
  名2=4,//可以赋值,下面数值接着从此开始
  名3
}

枚举的类型转换

1.枚举和int互转后是数值的转换
2.枚举转换成string是枚举名
3.string转换成枚举,必须有这个字符串名的枚举名,实例如下:

Enum.Parse(typeof(声明枚举类型名),"Other");

数组

数组是储存一组相同的数值集合,下标从0开始。

一维数组

声明:变量类型【】 数组名=new 变量类型【数组长度】{ 1,2,3,4……(第数组长度-1个) };
获取长度:数组名.length;

二维数组

声明:变量类型【,】 二维数组名=new 变量类型【行,列】{ { 1,1,1… },{ 1,1,1…. },{ 1,1,1…. }… };
获取长度:数组名.length(维度);

交叉数组

即数组的数组。

结构体

public struct 结构体名{
  变量类型 变量名
  
  构造函数(可选)
  
  函数
}

结构体和类相同点:
1.两者都拥有成员,包括:构造函数、方法、属性、字段、常量、枚举类型、事件、以及事件处理函数。
2.两者的成员都有其各自的存取范围。例如,可以将某一个成员声明为Public,而将另一个成员声明为Private。
3.两者都可以实现接口。
4.两者都可以公开一个默认属性,然而前提是这个属性至少要取得一个自变量。
5.两者都可以声明和触发事件,而且两者都可以声明委托(Delegate)。
6.两者都是container类型,这表示它们可以包含其他数据类型作为成员。

区别:
1.结构是实值类型(Value Types),而类则是引用类型(Reference Types)。
2.结构使用栈存储(Stack Allocation),而类使用堆存储(Heap Allocation)。
3.所有结构成员默认都是Public,而类的变量和常量数则默认位Private,不过其他类成员默认都是Public。
4.结构成员不能被声明位Protected,而类成员可以。
5.结构变量声明不能指定初始值、使用New关键字货对数组进行初始化,但是类变量声明可以。
6.结构不能声明默认的构造函数,也就是不拥有参数的非共享构造函数,但是类则无此限制。
7.二者都可以拥有共享构造函数,结构的共享构造函数不能带有参数,但是类的共享构造函数则可以带或者不带参数。
8.结构不允许声明析构函数(Destructor),类则无此限制。
9.结构的实例(Instance)声明,不允许对包含的变量进行初始化设定,类则可以在声明类的实例时,同时进行变量初始化。
1.结构是隐式继承自ValueType类,而且不能继承任何其他类型,类则可以继续自ValueType以外的任何类。
11.结构是无法被继承的,类则可以。
12.结构永远不会终止,因此CLR不会在任何结构上调用Finalize方法。类则是由内存回收进程加以终止,当内存回收进程检测到没有任何作用的类时,它就会调用类的Finalize方法。
13.结构不需要构造函数,类则需要构造函数。
14.结构只能在一种情况下使用非共享构造函数,那就是非共享构造函数会接受参数。但是类则无此限制,它可以使用带参数或不带参数的非共享构造函数。
15.每一个结构都具有无参数的隐含公共构造函数,此构造函数会将结构的所有成员初始化为其默认值。不需要重新定义这个行为。在“实例和变量”层面上,由于结构是数值类型的,因此每一个结构变量会永远的绑定到结构实例上。然而类是引用类型的,而且对象变量可引用不同的类实例,在此方面的区别,会对使用将结构和类造成如下的影响:
16.结构变量会隐式的使用结构的无参数构造函数来初始化成员,这就意味语句 Struct S = new Struct()。
17.当您将一个结构变量赋值给另一个,或者将结构实例传递到程序变量时,所有变量成员的值会复制到新的结构中。当您将一个对象变量赋值给另一个,或者将对象变量传递给程序时,则只是复制指针。
18.您可以将Null值赋值给结构变量,但是该实例会一直与该变量保持关联。虽然变量成员会因此赋值而重新初始化,但是您还是可以调用变量的方法并访问其数据成员。相反的,如果您将对象变量设定为Null,您就会中断它与任何类型实例的关联,而且除非您再将另一个实例赋值给它,否则无法通过变量访问任何成员。
19.您可以在不同时间将不同的类的实例赋值给同一个对象变量,而且在同一时间可有好几个对象变量引用相同的类实例,如果您对类成员值做了改变,则其他指向相同实例的对象变量也会发生改变。然而,结构成员则会封装在他们自己的实例中,变更结构成员值并不会对其他任何结构变量的成员造成影响,甚至也不会影响相同结构声明的其他实例。
20.两个结构必须以成员对成员的比较方式来执行相等比较。两个对象变量可以使用Equals方法来加以比较。Equals会判断两个变量是否指向相同的实例。

如何选择结构还是类:
1.堆栈的空间有限,对于大量的逻辑的对象,创建类要比创建结构好一些
2.结构表示如点、矩形和颜色这样的轻量对象,例如,如果声明一个含有 1000 个点对象的数组,则将为引用每个对象分配附加的内存。在此情况下,结构的成本较低。
3.在表现抽象和多级别的对象层次时,类是最好的选择。
4.大多数情况下该类型只是一些数据时,结构时最佳的选择。

值类型和引用类型

值类型

其他类型、结构体;
存储位置:栈空间–系统分配,自动回收,小而快
特点:在赋值时,把内容拷贝给对方,它变我不变,内存地址不变。

引用类型

string、数组、类
存储位置:手动申请和释放,大而慢
特点:在赋值时,让俩者指向一个值,它变我也变,指向堆中相同内存地址。

特殊引用类型string

string在赋值时也会再分配一个内存空间。

函数

函数可以写在类中和结构体中。

函数基础

基本语法:static 返回类型 函数名(参数类型 参数名1….){ 代码逻辑;return 返回值 }

ref和out

在函数内部传入,里面变了,外面也变了。
声明:函数参数的修饰符;
区别:ref传入的参数必须初始化,out传入的变量必须在内部赋值;

变长参数和参数默认值

变长参数声明:params 变量类型[] 变量名;
参数默认值:可选参数,在方法声明时就进行赋值,可选参数必须写在普通参数后面;

函数重载

定义:重载和返回值无关,和参数类型、个数、顺序有关;

递归函数

定义:就是让函数自己调用自己,但是需要留出出口,否则就是死循环