- A+
所属分类:.NET技术
1 枚举
enum E_MonsterType//定义了一个枚举的变量类型 { normal1,//0 boss = 5,//5 normal2,//6,前一个自动加1 } //枚举和switch语句天生一对,写switch时能对枚举类型自动补全 E_MonsterType monsterType = E_MonsterType.boss;/声明枚举变量 switch (monsterType) { case E_MonsterType.normal1: Console.WriteLine("普通怪物逻辑"); break; case E_MonsterType.boss: Console.WriteLine("boss怪物逻辑"); break; default: break; }
2 数组
2.1 数组
int[] arr1;//声明数组但没有初始化 int[] arr2 = new int[5];//初始化,不设置初始值则默认为0 int[] arr3 = new int[5] {1,2,3,4,5};//初始化并赋值,设置的长度是多少,则初始一定要赋多少值 int[] arr4 = new int[] {1,2};//数组长度看大括号里面有几个就是几个 int[] arr5 = {1,2,3,4,5,6,7}; int[] arr6 = new int[8]; bool[] arr7 = new bool[] { true, false }; Console.WriteLine(arr5.Length);//数组变量名.Length获取数组长度 foreach(int i in arr5) { Console.WriteLine(i); } //数组定义之后,是没办法直接添加新的元素,只能通过声明新的数组再复制过去 for(int i = 0; i < arr5.Length; i++) { arr6[i] = arr5[i]; } arr6[7] = 8;
2.2 二维数组
int[,] arr; int[,] arr2 = new int[3,3];//初始化一个三行三列全0的二维数组 int[,] arr3 = new int[3, 3] { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } };//初始化并定义三行三列的数组 int[,] arr4 = new int[, ] { { 1, 2, 3 },{ 4, 5, 6 },{ 7, 8, 9 } }; int[,] arr5 = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } }; Console.WriteLine(arr5.GetLength(0));//获取二维数组的行数 Console.WriteLine(arr5.GetLength(1));//获取二维数组的列数 //foreach也可以按行优先原则输出二维数组元素 foreach(int i in arr5) { Console.WriteLine("{0}",i); }
2.3 交错数组
int[][] arr1 = new int[3][] { new int[] { 1, 2, 3 }, new int[] { 4, 5 }, new int[] { 6 } };//每行的列数可以不同 Console.WriteLine($"数组的行数为:{arr1.GetLength(0)}"); Console.WriteLine($"数组某一行的列数为:{arr1[0].Length}"); foreach (int[] a in arr1)//交错数组的元素是数组 { foreach(int b in a) { Console.WriteLine(b); } }
3 值类型和引用类型
引用类型:string,数组,类
值类型:其它的,结构体
//无符号整型 byte b1 = 1; ushort us = 1; uint ui = 1; ulong ul = 1; //有符号整型 sbyte sb = 1; short s = 1; int i = 1; long l = 1; //浮点型 float f = 1f; double d = 1.1; decimal de = 1.1m; //特殊类型 bool bo = true; char c = 'a'; string str = "strs"; //复杂数据类型 //enum 枚举 //数组 (一维,二维,交错) //类 //结构体
值类型和引用类型区别
值类型 在相互赋值时 把内容复制给对方 它变我不变
引用类型在相互赋值时 让两者指向同一个值 它变我也变
//1、使用上的区别 //值类型 int a = 10; //引用类型 int[] arr = { 1, 2, 3, 4, 5, 6, }; int b = a; int[] arr2 = arr; Console.WriteLine($"a={a},b={b}"); Console.WriteLine($"arr[0]={arr[0]},arr2[0]={arr2[0]}"); b = 20; arr2[0] = 0; Console.WriteLine("修改后:"); Console.WriteLine($"a={a},b={b}"); Console.WriteLine($"arr[0]={arr[0]},arr2[0]={arr2[0]}"); //值类型 在相互赋值时 把内容复制给对方 它变我不变 //引用类型在相互赋值时 让两者指向同一个值 它变我也变 //2、原因 //它们在内存的存储方式是不同的 //值类型存储在 栈空间,由系统分配,自动回收,小而快 //引用类型存储在 堆空间,手动申请和释放,大而慢 //new了新的内存空间,就和arr没关系了 arr2 = new int[] {99,1,2,3}; Console.WriteLine($"arr[0]={arr[0]},arr2[0]={arr2[0]}");
string的它变我不变
//string的它变我不变 string str1 = "123"; string str2 = str1; //string特殊的地方在于重新赋值时会在堆中重新分配空间,因此它变我不变 //在频繁对string重新赋值时,会产生内存垃圾 str2 = "321";
4 函数
4.1 函数语法
//无参无返回值 static void SayHello() { Console.WriteLine("你好!"); } //有参无返回值 static void SayYourName(string name) { Console.WriteLine($"你的名字是:{name}"); } //无参有返回值 static string YourName() { return "tyy"; } //有参有返回值 static int Sum(int a, int b) => a + b;//一行代码的可以用=>表示返回值 //有参有多返回值(用数组) static int[] SumAverage(int a, int b) { int sum = a + b; int avg = sum / 2; //int[] arr = { sum, avg }; return new int[] {sum,avg};//一步返回数组需要new } SayHello(); SayYourName("tyy"); SayYourName(YourName());//一个函数的返回值作为另一个函数的参数传入 Console.WriteLine(Sum(1,2)); int[] arr = SumAverage(7, 9);//也用数组接收函数的数组返回值 Console.WriteLine($"{ arr[0]}, {arr[1]}");
4.2 ref 和 out
作用:可以解决在函数内部改变外部传入的参数,函数里面改变外面也会改变
//普通函数 static void ChangeValue(int value) { value = 3; } static void ChangeArray(int[] arr) { arr = new int[] { 10, 20, 30 };//重新声明数组,外面没有改变 } static void ChangeArrayValue(int[] arr) { arr[0] = 99; } //参数加ref static void ChangeValueRef(ref int value)//定义参数前面加上ref { value = 3; } static void ChangeArrayRef(ref int[] arr) { arr = new int[] { 10, 20, 30 }; } //参数加out static void ChangeValueOut(out int value)//定义参数前面加上out { value = 33; } static void ChangeArrayOut(out int[] arr) { arr = new int[] { 100, 20, 30 }; } int a = 1; ChangeValue(a);//a的值没有改变,因为int是值类型 ChangeValueRef(ref a);//传入参数前也要加上ref或out,修改成功 ChangeValueOut(out a); int[] arr1 = {1, 2, 3 }; ChangeArray(arr1);//函数内重新声明数组,原数组元素值未改变 ChangeArrayValue(arr1);//a[0]改变了 ChangeArrayRef(ref arr1);//一起改变了 ChangeArrayOut(out arr1);
4.3 变长参数 params 和参数默认值
4.3.1 变长参数
params int[]意味着可以传入任意n个参数,n可以为0,传入的参数存在arr数组中
- params 关键字后面一定是数组
- 数组可以是任意类型
- 函数的参数可以是 其他类型的参数和 params 修饰的参数
- 最多只能有一个 params 关键字,且一定放在最后一组参数
static int Sum(params int[] arr) { int sum = 0; for(int i = 0; i < arr.Length; i++) { sum += arr[i]; } return sum; } Sum(); Sum(1, 2, 3, 4, 1, 2, 4, 12, 5, 235, 5, 23, 1, 4, 1);//任意长的参数个数都可以
4.3.2 参数默认值
当函数调用时如果不传入参数,则使用默认值作为参数传入
每个参数都可以有默认值,有默认值的参数必须写在普通参数的后面
static void Speak(string str = "没什么说的") { Console.WriteLine(str); } Speak();//使用默认参数 Speak("giao!");//使用传入参数
4.4 函数重载
在同一语句块中,函数的名字相同,但参数的数量、类型或顺序不同,与返回值无关
static int Sum(int a, int b) { return a + b; } static int Sum(int a, int b, int c)//参数数量不同 { return a + b + c; } static float Sum(int a, float b)//参数类型不同 { return a + b; } static float Sum(float a, int b)//参数顺序不同 { return a + b; } static int Sum(ref int a, int b)//ref和out也算重载,但一个重载的话另一个就不能重载了,两个中只取一 { return a + b; } static int Sum(out int a, int b)//ref和out也算重载,但一个重载的话另一个就不能重载了 { a = 1; b = 2; return a + b; } static float Sum(int a, int b, params int[] arr)//变长参数重载 { return 1; }
5 结构体
struct Student { //public和private修饰结构体中的变量和函数,表示能否被外部使用 //默认(啥都不写)为private //变量 public int age; public bool sex; public int number; public string name; //函数方法 表现这个结构体的行为,不需要加static关键字 public void Speak() { //函数中可以直接使用结构体声明的变量 Console.WriteLine($"我的名字是{name},今年{age}岁"); } //构造函数 用于在外部方便结构体的初始化 //没有返回值,和结构体名字相同,必须有参数,声明构造函数必须对其中所有变量初始化 public Student(int age, bool sex, int number, string name) { //this关键字,相同变量名字时来区分自己和参数 this.age = age;//必须初始化 this.sex = sex; this.number = number; this.name = name; } } Student s1; s1.age = 10;//public才能在外部使用变量和函数 s1.sex = false; s1.number = 1; s1.name = "tyy"; s1.Speak();