C 程式語言(六) 列舉型別與結構型別

2022-05-18 20:24:35 字數 3037 閱讀 5875

列舉型別

列舉型別(也稱為列舉)為定義一組可以賦給變數的命名整數常量提供了一種有效的方法。

例如,假設您必須定義乙個變數,該變數的值表示一周中的一天。

該變數只能儲存七個有意義的值。

若要定義這些值,可以使用列舉型別。列舉型別是使用 enum 關鍵字宣告的。

enum

days ;

如果未在列舉數列表中指定元素的值,則值將自動按 1 遞增。

在前面的示例中,days.sunday 的值為 0,days.monday 的值為 1,依此類推。建立新的 days 物件時,如果不顯式為其賦值,則它將具有預設值 days.sunday (0)。

建立列舉時,應選擇最合理的預設值並賦給它乙個零值。

這便使得只要在建立列舉時未為其顯式賦值,則所建立的全部列舉都將具有該預設值。

使用列舉的好處:

明確為客戶端**指定哪些值是變數的有效值。

在 visual studio 中,intellisense 列出定義的值。

可以將任意值賦給列舉型別的列舉數列表中的元素,也可以使用計算值:

enum

machinestate

控制項列舉的底層儲存

預設情況下,c#儲存列舉值的資料型別是system.int32(int)。當然我們可以按環境的需要做改變。如程式用在低記憶體的裝置中時,為了省記憶體我們使用byte型別:

enum

months :

byte

;

宣告和使用列舉

設定了列舉範圍和儲存型別後,就可以使用它代替所謂的幻數(看不出意義的常數數值)了。列舉是自定義型別,我們可以使用列舉作為區域性變數,方法引數,方法返回值等。

system.enum 類

為列舉提供基類。.net列舉從system.enum類獲得了很多功能,enum類定義了許多查詢和轉換某個列舉的方法。

enum

型別公開的部分核心成員:

getname

在指定列舉中檢索具有指定值的常數的名稱。

getnames

檢索指定列舉中常數名稱的陣列。

gettype:

獲取當前例項的 type

。getunderlyingtype :返回指定列舉的基礎型別。

tostring()

將此例項的值轉換為其等效的字串表示形式。

getvalues

檢索指定列舉中常數值的陣列。

parse(type,

string)

將乙個或多個列舉常數的名稱或數字值的字串表示轉換成等效的列舉物件。

結構型別

結構型別是一種值型別,通常用來封裝小型相關變數組,例如,矩形的座標或庫存商品的特徵。結構型別很適合在應用程式中對數學、幾何及其他「原子」實體建模。結構(和列舉相似)是自定義型別,但不止是一組名稱/值對。結構可以包括許多數字欄位與操作這些欄位的成員的型別。

注意:1.結構可以包含建構函式、常量、字段、方法、屬性、索引器、運算子、事件和巢狀型別,但如果同時需要上述幾種成員,則應當考慮改為使用類作為型別。

2.結構可以實現介面,但它們無法繼承另乙個結構(結構是隱式sealed,是不可被繼承的)。因此,結構成員無法宣告為protected

struct

point

//add 1 to the (x, y) position.

public

void

increment()

//subtract 1 to the (x, y) position.

public

void

decrement()

//display the current position.

public

void

display()

, y =

", x, y);}}

使用結構

一、建立乙個結構變數,在使用前為它的所有公共字段賦值。否則會受到編譯錯誤。

point mypoint;

mypoint.x

=349;//

mypoint.y = 76; 缺少這個賦值,會收到編譯錯誤!

mypoint.display();

二、使用new關鍵字建立結構變數,它會呼叫結構的預設建構函式,給公共欄位賦預設值。

point mypoint

=new

point();

//輸出 x=0,y=0

mypoint.display();

結構型別與類型別的區別

結構型別和類型別實際上都是建立物件的模版,每個物件都包含資料,並提供了處理和訪問資料的方法。在語法上,非常相似,主要的區別:

一、定義使用的關鍵字不一樣,結構使用struct而類型別使用class。

二、結構是值型別的,而類型別是引用型別的。(注意:雖然結構的初始化使用了new操作符,可是結構物件依然分配在堆疊上,如果不使用new那麼在初始化所有字段之前,欄位將保持為未賦值狀態,且物件不可用。)

三、結構是無法從另外乙個結構或者類繼承,本身也不能被繼承(結構是隱式sealed)。(注:雖然結構不能被繼承,可是結構能夠繼承介面,方式和類繼承介面一樣。)

四、結構型別變數可以不使用new關鍵字初始化,而類型別的物件必須使用new初始化(靜態類除外)。

如何選擇結構還是類

1.棧(stack)的空間有限,對於大量的邏輯的物件,建立類要比建立結構好一些。

2.結構型別很適合在應用程式中對數學、幾何及其他輕量的「原子」實體建模。例如,如果宣告乙個含有 1000 個點物件的陣列,則將為引用每個物件分配附加的記憶體。在此情況下,結構的成本較低。

3.在表現抽象和多級別的物件層次時,類是最好的選擇。

4.大多數情況下該型別只是一些資料時,結構時最佳的選擇。

Unity C 爆破計畫(六) 列舉和結構體

covers 列舉和結構體 列舉是一種有限集合。生活中的有限集合很多,比如 一周中每天的名稱 只有 7 種 生日對應的星座 只有 12 種 現在好像是 13 種了?這些事物都適合用列舉來描述。寫乙個列舉的例子 using system namespace enums class program 我們...

C 學習筆記6 列舉型別

c 的enum工具提供了另一種建立符號常量的方式,這種方式可以代替const。我們可以使用關鍵字enum,比如定義乙個顏色的列舉型別,enum color 列舉型別變數內容必須是整數型別,預設是從0開始的,不允許是浮點型別。但是我們可以給變數賦值,然後之後的值加一。定義乙個列舉變數內容可以是整形,也...

C 基礎 六) 列舉的一些常用操作

本章將介紹以下幾點 1 如何把其它型別轉換為列舉型別?2 如何把列舉中的值新增到下拉列表中?一 如何把其它型別轉換為列舉型別?我們回顧一下有關字串與數字之間的轉換,如 stringstrvalue 12 intvalue int.parse strvalue 使用int.parse 就可以把字串轉換...