C#之列舉和結構體
1.列舉
什麼是列舉?
列舉:可以被窮舉(數的過來)的結構, 有限個數.
(1)使用enum關鍵字來宣告,與類同級。列舉本身可以有修飾符,但列舉的成員始終是公共的,不能有訪問修飾符。列舉本身的修飾符僅能使用public和internal。
(2)列舉是值型別,隱式繼承自System.Enum,不能手動修改。System.Enum本身是引用型別,繼承自System.ValueType。
(3)列舉都是隱式密封的,不允許作為基類派生子類。
(4)列舉型別的列舉成員均為靜態,且預設為Int32型別。
(5)若要修正列舉型別的內部的變數的型別的話 :整型型別.
(6)每個列舉成員均具有相關聯的常數值。此值的型別就是列舉的底層資料型別。每個列舉成員的常數值必須在該列舉的底層資料型別的範圍之內。如果沒有明確指定底層資料型別則預設的資料型別是int型別。
(7)列舉成員不能相同,但列舉的值可以相同。
(8)列舉最後一個成員後面的逗號可以省略.
2.如何使用列舉?
有時將若干簡單資料型別的專案組合起來,形成一個有機的整體,使用起來更方便。為此,C#提供了列舉(enumeration)、結構(structure)與集合(collection)型別。
列舉,即有限、可數的資料元素組成的集合。例如,一週內星期一到星期日7個數據元素組成的集合,一年內12個月組成的集合。這些資料元素分別被賦予了名稱,不但表示了它們所包含的意義,而且還確定了它們在集合中的排列順序。
在C#語言中,列舉是用識別符號表示的整型常量的集合,即列舉成員是具有整數型別的符號常量。在預設的情況下,第一個列舉成員的值為0,此後每個列舉成員的值遞增1。
在程式設計中使用列舉,具有以下意義:
(1)列舉中的所有資料項都被賦予了描述性的名稱,會使程式更加容易理解;
(2)一旦聲明瞭一個列舉型別,它的有效取值範圍就被限定了,從而避免了非法取值的可能性;
(3)在程式程式碼輸入過程中,為列舉例項賦值時,可以從自動彈出動態提示列表中選擇,從而使程式程式碼輸入更加直觀便捷。
宣告列舉型別的一般形式如下: enum 列舉名 [:基本資料型別] { 列舉常量列表 }
其中:
enum : 定義列舉型別的關鍵字
列舉名 定義列舉型別時賦予的命名,使用C#合法識別符號
基本資料型別 :可選,用於指定列舉型別中列舉成員的基本資料型別。所有枚 舉成員的資料型別相同,預設為整型(int)
列舉常量列表 :用便於理解的識別符號組成的列舉成員列表,兩個相鄰的列舉成 員之間用逗號分隔

如圖所示
下面有一個小練習:
寫一個方法,根據傳入的列舉動作,做出不同的響應:瞄準 左移 右移 射擊等
在呼叫該方法處:
1.獲取使用者的輸入
2.將輸入轉換為列舉
3.傳入上面寫的方法進行呼叫

首先先定義一個槍型別的列舉
其次寫一個槍支類通過switch case 方法實現行為:

最後在Main方法中進行呼叫:

列印結果:

2.結構體
C#中結構型別和類型別在語法上非常相似,他們都是一種資料結構,都可以包括資料成員和方法成員。
結構和類的區別:
1、結構是值型別,它在棧中分配空間;而類是引用型別,它在堆中分配空間,棧中儲存的只是引用。
2、結構型別直接儲存成員資料,類的資料在棧中的變數儲存的是指向堆中資料物件的引用。
3、C#中的簡單型別,如int、double、bool等都是結構型別。如果需要的話,甚至可以使用結構型別結合運算子運算過載,再為C#語言創建出一種新的值型別來。
4、由於結構是值型別,並且直接儲存資料,因此在一個物件的主要成員為資料且資料量不大的情況下,使用結構會帶來更好的效能。
規則:
結構型別可以有例項建構函式和靜態建構函式,但不能有解構函式。
結構直接派生自System.ValueType,間接派生自System.Object,但結構是隱式密封的,不能作為基類再派生出其他的結構,也不能從類派生,但可以實現介面。
2.1.結構體的使用
有時將若干簡單資料型別的專案組合起來,形成一個有機的整體,使用起來更方便。為此,C#提供了列舉(enumeration)、結構(structure)與集合(collection)型別。
結構是由多個不同資料型別的相關元素組合在一起而形成的一種資料結構。
在日常工作中,特別是管理性質的工作中,經常會用到結構型別。
例如,學生的姓名、性別、年齡、電話、學科成績等資料項,它們具有密切的相關性,但又具有各自不同的資料型別,就可以把它們組合成一個整體。

結構體的宣告
結構和列舉一樣,不能作為一個整體被引用,程式中只能以“結構名.結構成員名”的形式訪問結構中的成員,可以對其執行讀寫操作。
下面有個例子:
定義一個結構型別Person,有三個成員,分別為姓名,性別,年齡 性別用列舉型別
宣告兩個Person型別的變數,分別表示 張三 男 18歲/ 小蘭 女 18歲
首先宣告一個Person型別的結構型別:

然後再Main方法中進行呼叫即可:

輸出結果如下:
