【C#基礎】列舉(Enum)、結構體(Struct)、委託(Delegate)
1.列舉(Enum)
確定數量,確定取值。方向(東南西北),性別(男女)
語法:
[public] enum 列舉名
{
值1,
值2,
值3,
........
}
public:訪問修飾符。公開的公共的,哪都可以訪問。
enum:關鍵字,宣告列舉的關鍵字
列舉名:要符合Pascal命名規範
將列舉宣告到名稱空間的下面,類的外面,表示這個名稱空間下,所有的類都可以使用這個列舉。
列舉就是一個變數型別 ,int--double string decimal。只是列舉宣告、賦值、使用的方式跟那些普通的變數型別不一樣。
我們可以將一個列舉型別的變數跟int型別和string型別互相轉換。
列舉型別預設是跟int型別相互相容的,所以可以通過強制型別轉換的語法互相轉換。
當轉換一個列舉中沒有的值的時候,不會拋異常,而是直接將數字顯示出來。
列舉同樣也可以跟string型別互相轉換,如果將列舉型別轉換成string型別,則直接呼叫ToString().
如果將字串轉換成列舉型別則需要下面這樣一行程式碼:
(要轉換的列舉型別)Enum.Parse(typeof(要轉換的列舉型別),"要轉換的字串");
如果轉換的字串是數字,則就算列舉中沒有,也會不會拋異常。
如果轉換的字串是文字,如果列舉中沒有,則會丟擲異常。
enum GameState//定義列舉型別的遊戲狀態 { Start,//開始,預設代表的整數是0 Pause,//暫停,預設代表的整數是1 Stop//結束,預設代表的整數是2 } class Program { static void Main(string[] args) { GameState state = GameState.Start;//利用定義好的列舉型別去宣告變數 if (state != GameState.Stop)//列舉型別比較 { state = GameState.Stop; Console.WriteLine("遊戲結束"); } Console.ReadKey(); } }
2.結構體(Struct)
可以幫助我們一次性宣告多個不同型別的變數。我們可以把結構體當成幾個型別組成了一個型別
enum Direction//定義一個列舉型別的方向
{
East,
West,
North,
South
}
struct Path//定義一個結構型別的路徑,包含兩個欄位,列舉型別的方向和float型別的距離
{
public Direction direction;
public float distance;
}
class Program
{
static void Main(string[] args)
{
Path path;//利用定義好的結構宣告一個結構變數
path.direction = Direction.South;
path.distance = 1000f;
}
}
3.委託(Delegate)
委託是一種儲存函式的引用型別,委託的本質也是一個函式
委託的定義指定了一個返回值型別和一個引數列表
委託的定義需要使用關鍵字Delegate,委託沒有函式體
可以把一個函式直接賦值給委託,但該函式的返回值和引數型別必須和委託一致
public delegate int MyDelegate(params int[] nums);//定義一個委託
class Program
{
//陣列求和
public static int Getsum(params int[] nums)
{
int sum = 0;
for (int i = 0; i < nums.Length; i++)
{
sum += nums[i];
}
return sum;
}
static void Main(string[] args)
{
MyDelegate de;
de = Getsum;//讓委託指向函式Getsum
int sum = de(10, 20, 30, 40);
Console.WriteLine(sum);
Console.ReadKey();
}
}
除了我們自己定義的委託之外,C#還有定義了兩種內建的委託型別,Action和Func
Action委託可以有引數,但不能有返回值
Action<int> a;//int表示引數型別
Func委託既有引數,也有返回值
Func<int, int, int> f;//<>號中,最後一個泛型表示返回值型別,前面的泛型表示引數型別