1 枚舉 enum E_MonsterType//定義了一個枚舉的變數類型 { normal1,//0 boss = 5,//5 normal2,//6,前一個自動加1 } //枚舉和switch語句天生一對,寫switch時能對枚舉類型自動補全 E_MonsterType monsterType ...
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();