C#基础

C#基础
Aholic~茜复杂数据类型
一般是多个数据集合在一起构成的数据。
枚举
是一个被命名的整型常量的集合
基本结构
1 | enum E_xxx |
枚举中如果没有赋值的话式默认自动上升序列
在哪里声明
在namespace结构块里声明(常用)。
也可以声明在class和struct结构块里。
但是不可以在函数语句块里声明。
枚举的使用
虽然枚举的声明在函数外,但是使用枚举仍然在函数里。
例如:
1 | E_xxx xxx = E_xxx.x1; |
由于枚举是一个常量集合,因此他与swich高度适配。
枚举的类型转换
基本遇不到,如果遇到就直接强转。
string转枚举
1 | xxx = (E_xxx)Enum.Parse(typeof(E_xxx), "x2"); |
一维数组
数组的声明
1 | int[] arr1; |
1 | int[] arr2 = new int[5]; |
1 | int[] arr3 = new int[5]{ 1, 2, 3, 4, 5}; |
1 | int[] arr4 = new int[]{1, 2, 3, 4}; |
1 | int[] arr5 = {1, 2, 3, 4, 5, 6}; |
数组的长度
1 | console.WriteLine(arr.Length); |
获取数组中的元素
与c++一致。
修改数组的元素
与c++一致
遍历数组
与c++一致
增加或减少数组的元素
不能直接增加或者减少,只能搬家。
查找数组中的元素
遍历一遍然后寻找和要找的值相等的数。
二维数组
二维数组的声明
1 | int[,] arr; |
1 | int[,] arr2 = new int[n, m]; |
1 | int[,] arr3 = new int[3,3]{{1, 2, 3}, {1, 2, 3}}; |
1 | int[,] arr4 = new int[,] { {1, 2, 3}, {1, 2, 3}}; |
数组的行和列
1 | Console.WriteLinne(arr.GetLength(0));//行 |
增加和减少元素
和一维数组相似,无法直接删除或添加,只能搬家。
查找元素
与一位数组一样,也是遍历查找。
交错数组
数组的数组
数组的声明
1 | int[][] arr1; |
1 | int[][] arr2 = new int[3][]; |
1 | int[][] arr3 = new int[3][] { new int[]{1, 2, 3},new int[]{1, 2}, new int[]{1}}; |
1 | int[][] arr4 = new int[][] {new int[]{1, 2, 3},new int[]{1, 2}, new int[]{1}}; |
1 | int[][] arr5 = {...}; |
数组的长度
1 | Console.WriteLine(arr.GetLength(0));//行 |
获取数组中的元素
1 | Console.WriteLine(arr[0][1]); |
值的类型和引用类型
引用类型
string,数组, 类都是引用类型。
相互赋值时让两者指向同一个值,类似指针
引用类型存储在 堆空间:
- 手动申请和释放,大而慢。
值类型
除了上述三类之外都是值类型。
相互赋值时会把内容拷贝给对方
值类型存储在 栈空间:
- 系统分配,小而快。
特殊的引用类型string
string非常特殊,它具备值类型的特征:他变我不变。
每次对string赋值都会重新开一个空间,会消耗相应的内存。
因此存在一个string的缺点,就是在不断重复赋值的过程中会不断产生内存垃圾,影响程序性能。
函数
函数的基础
函数写在哪
函数写在class和struct语句块中。
函数的写法
static 返回类型 函数名(参数类型 参数名1, 参数类型 参数名2,…….)
{
函数的代码逻辑;
…………..;
return 返回类型;
}
关于函数名,一般使用帕斯卡命名法
ref 和 out
他们可以解决在函数内部改变外部传入的内容的问题
ref 和 out 的使用
就是在函数声明时,在变量前面加一个ref,同理在使用的时也在传入的参数前面加一个ref。
out的使用上与ref一模一样。
ref 和 out 的区别
1、ref传入的变量必须初始化,out不用。
2、out传入的变量必须在内部赋值,ref不用。
变长参数和参数默认值
变长参数的关键词
params。
1 | static int Sum(params int[] arr) |
变长参数意味着可以传入任意个参数,传入参数会存在arr数组中。
写params后,参数类型必须是数组,否则会报错
函数参数中最多只能出现一个params关键字,而且一定是最后一组参数,前面可以有其他参数。
参数默认值(可选参数)
当调用函数的时候可以不传入参数,不传入参数就会使用默认参数值作为参数的值。
支持多参数默认值,每一个参数都可以有默认值。
如果要混用可选参数 必须加在 普通参数后面。
函数重载
基本概念
在同一个语句块中,函数名相同,参数类型不同,参数数量不同。
使用
使用时直接传参进去就可以,系统会根据你传参的类型和数量自动进行判断。
递归函数
与c++一致。
结构体
在结构体中的方法,不需要加static关键字。
函数中可以直接使用结构体内部声明的变量。
大部分结构体相关知识与c++一致
修饰词
在c#中结构体内部的变量初始均为私有,只有自己改成公共才能在外部使用。修改方式为:
1 | public int a; |
结构体构造函数
一般用于方便外部对变量进行初始化的。
在结构体中构造函数,函数名一定是结构体名,没有返回值,必须有参数,参数必须初始化。
新关键字 this :表示自己。
使用:
1 | Student s2 = new Student(18, true, 2, "小红"); |
排序
与c++算法一致。