1. 程式人生 > >【C#基礎】列舉(Enum)、結構體(Struct)、委託(Delegate)

【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;//<>號中,最後一個泛型表示返回值型別,前面的泛型表示引數型別