C#進(jìn)階-枚舉和結(jié)構(gòu)體

枚舉:可以被窮舉的結(jié)構(gòu) 有限個數(shù)

使用enum關(guān)鍵字來聲明,與類同級。枚舉本身可以有修飾符,但枚舉的成員始終是公共的,不能有訪問修飾符。枚舉本身的修飾符僅能使用public和internal。

枚舉是值類型,隱式繼承自System.Enum,不能手動修改。System.Enum本身是引用類型,繼承自System.ValueType。

枚舉都是隱式密封的,不允許作為基類派生子類。

枚舉類型的枚舉成員均為靜態(tài),且默認(rèn)為Int32類型。

若要修正枚舉類型的內(nèi)部的變量的類型的話 :整型類型

每個枚舉成員均具有相關(guān)聯(lián)的常數(shù)值。此值的類型就是枚舉的底層數(shù)據(jù)類型。每個枚舉成員的常數(shù)值必須在該枚舉的底層數(shù)據(jù)類型的范圍之內(nèi)。如果沒有明確指定底層數(shù)據(jù)類型則默認(rèn)的數(shù)據(jù)類型是int類型。

枚舉成員不能相同,但枚舉的值可以相同。

枚舉最后一個成員后面的逗號可以省略

有時將若干簡單數(shù)據(jù)類型的項目組合起來,形成一個有機(jī)的整體,使用起來更方便。為此,C#提供了枚舉(enumeration)、結(jié)構(gòu)(structure)與集合(collection)類型。

枚舉,即有限、可數(shù)的數(shù)據(jù)元素組成的集合。例如,一周內(nèi)星期一到星期日7個數(shù)據(jù)元素組成的集合,一年內(nèi)12個月組成的集合。這些數(shù)據(jù)元素分別被賦予了名稱,不但表示了它們所包含的意義,而且還確定了它們在集合中的排列順序。

在C#語言中,枚舉是用標(biāo)識符表示的整型常量的集合,即枚舉成員是具有整數(shù)類型的符號常量。在默認(rèn)的情況下,第一個枚舉成員的值為0,此后每個枚舉成員的值遞增1。

在程序設(shè)計中使用枚舉,具有以下意義: ?

(1)枚舉中的所有數(shù)據(jù)項都被賦予了描述性的名稱,會使程序更加容易理解;?

(2)一旦聲明了一個枚舉類型,它的有效取值范圍就被限定了,從而避免了非法取值的可能性; ?

(3)在程序代碼輸入過程中,為枚舉實例賦值時,可以從自動彈出動態(tài)提示列表中選擇,從而使程序代碼輸入更加直觀便捷。

聲明枚舉類型的一般形式如下: ?enum ?枚舉名 [:基本數(shù)據(jù)類型] { ??枚舉常量列表 }

其中: ?

? enum ????定義枚舉類型的關(guān)鍵字?

? 枚舉名 ??定義枚舉類型時賦予的命名,使用C#合法標(biāo)識符

? 基本數(shù)據(jù)類型 可選,用于指定枚舉類型中枚舉成員的基本數(shù)據(jù)類型。所有枚 舉成員的數(shù)據(jù)類型相同,默認(rèn)為整型(int)?

? 枚舉常量列表 用便于理解的標(biāo)識符組成的枚舉成員列表,兩個相鄰的枚舉成 員之間用逗號分隔

示例:

星期的枚舉類型: ??

enum WeekDays?

{ ???????

??????Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday?

}

如果在枚舉類型定義中未指定枚舉成員所對應(yīng)的值,默認(rèn)從0開始設(shè)定,此后的枚舉成員的值從該值開始遞增

enum WeekDays

{ ??????

???? ?Monday=1, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday?

}

如果在枚舉類型定義中指定了一個枚舉成員所對應(yīng)的值,此后的枚舉成員的值從該值開始遞增,直到遇到下一個指定對應(yīng)值的成員為止。如果確實需要,也可以為每一個枚舉成員單獨(dú)指定值。

示例:

下面是一個定義了太陽系中水星、金星、地球以及火星的軌道周期(即繞太陽一圈的天數(shù))的枚舉類型,其中的每個成員均被單獨(dú)指定值:

enum planetPeriods ????

{ ?????????

???? Mercury = 88, ?Venus = 225, ?Earth = 365, ?Mars = 687 ???

}

在定義枚舉類型時,可以顯式指定枚舉成員的數(shù)據(jù)類型。

例如,下面的定義指定枚舉成員的數(shù)據(jù)類型為無符號字節(jié)型: ??

enum ?weekDays : byte?

{ ???????

???? Monday=1, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday?

}

在C#語言中,枚舉不能作為一個整體被引用,只能使用“枚舉類型名.枚舉成員名”的方式訪問枚舉中的個別成員。枚舉成員本質(zhì)上是一個常量,因而不允許向其賦值,只能被讀取,而且應(yīng)該通過強(qiáng)制類型轉(zhuǎn)換才能將其轉(zhuǎn)換為基本類型的數(shù)據(jù)。 ?

示例: ?顯示太陽系中水星、金星、地球以及火星的軌道周期(即繞太陽一圈的天數(shù))

(int)planetPeriods.Mercury

(int)planetPeriods.Venus

(int)planetPeriods.Earth

(int)planetPeriods.Mars

追加:使用字符串名字獲取到枚舉

(weekDays)(Enum.Parse( typeof(weekDays),“Tuesday”));(會用就行)

結(jié)構(gòu)體:

C#中結(jié)構(gòu)類型和類類型在語法上非常相似,他們都是一種數(shù)據(jù)結(jié)構(gòu),都可以包括數(shù)據(jù)成員和方法成員。

  結(jié)構(gòu)和類的區(qū)別:

  1、結(jié)構(gòu)是值類型,它在棧中分配空間;而類是引用類型,它在堆中分配空間,棧中保存的只是引用。

  2、結(jié)構(gòu)類型直接存儲成員數(shù)據(jù),類的數(shù)據(jù)在棧中的變量保存的是指向堆中數(shù)據(jù)對象的引用。

  C#中的簡單類型,如int、double、bool等都是結(jié)構(gòu)類型。如果需要的話,甚至可以使用結(jié)構(gòu)類型結(jié)合運(yùn)算符運(yùn)算重載,再為C#語言創(chuàng)建出一種新的值類型來。

  由于結(jié)構(gòu)是值類型,并且直接存儲數(shù)據(jù),因此在一個對象的主要成員為數(shù)據(jù)且數(shù)據(jù)量不大的情況下,使用結(jié)構(gòu)會帶來更好的性能。

規(guī)則:

結(jié)構(gòu)類型可以有實例構(gòu)造函數(shù)和靜態(tài)構(gòu)造函數(shù),但不能有析構(gòu)函數(shù)。

結(jié)構(gòu)直接派生自System.ValueType,間接派生自System.Object,但結(jié)構(gòu)是隱式密封的,不能作為基類再派生出其他的結(jié)構(gòu),也不能從類派生,但可以實現(xiàn)接口。

有時將若干簡單數(shù)據(jù)類型的項目組合起來,形成一個有機(jī)的整體,使用起來更方便。為此,C#提供了枚舉(enumeration)、結(jié)構(gòu)(structure)與集合(collection)類型。

結(jié)構(gòu)是由多個不同數(shù)據(jù)類型的相關(guān)元素組合在一起而形成的一種數(shù)據(jù)結(jié)構(gòu)。 ?

在日常工作中,特別是管理性質(zhì)的工作中,經(jīng)常會用到結(jié)構(gòu)類型。

例如,學(xué)生的姓名、性別、年齡、電話、學(xué)科成績等數(shù)據(jù)項,它們具有密切的相關(guān)性,但又具有各自不同的數(shù)據(jù)類型,就可以把它們組合成一個整體。 ?

聲明結(jié)構(gòu)類型的一般形式如下: ????

struct ?結(jié)構(gòu)名 ????

{ ?????????

???? 結(jié)構(gòu)成員聲明語句1; ????????

???? 結(jié)構(gòu)成員聲明語句2; ????????

???? ......?????????

???? 結(jié)構(gòu)成員聲明語句n; ????

}

示例:

聲明了一個Student結(jié)構(gòu):

struct ?Student ????

{ ?????????

???? public string name; ????????

???? public string sex; ????????

???? public uint age; ????????

???? public string phone; ???????

???? public uint score; ???

}

結(jié)構(gòu)和枚舉一樣,不能作為一個整體被引用,程序中只能以“結(jié)構(gòu)名.結(jié)構(gòu)成員名”的形式訪問結(jié)構(gòu)中的成員,可以對其執(zhí)行讀寫操作。

public static void Main (string[] args)

{

???? Student student1 = new Student(); ??//創(chuàng)建Student類型的一個實例 ????????????

???? student1.name = "張馨馨"; ????????????

???? student1.sex = "女"; ????????????

???? student1.age = 19; ?????????????

???? student1.phone = "135xxxx9999"; ????????????

???? student1.score = 100; ?????????????

???? String studentInfo = "學(xué)生姓名:" + student1.name + "\n"; ???????????

???? studentInfo += "學(xué)生性別:" + student1.sex + "\n"; ????????????

???? studentInfo += "學(xué)生年齡:" + student1.age + "\n"; ????????????

???? studentInfo += "電話號碼:" + student1.phone + "\n"; ????????????

???? studentInfo += "學(xué)科成績:" + student1.score + "\n"; ?

???? Console.WriteLine (studentInfo);

}

結(jié)構(gòu)體的特征:

1.需要存儲比較復(fù)雜數(shù)據(jù)變量的時候 需要考慮使用結(jié)構(gòu)體

2.結(jié)構(gòu)體中可以編寫構(gòu)造函數(shù)和自定義函數(shù)

3.結(jié)構(gòu)體中的無參構(gòu)造不能自定義 只能由系統(tǒng)提供

4.結(jié)構(gòu)體是值類型的 每一次的賦值操作均產(chǎn)生副本(直接賦值和傳遞參數(shù))

5.結(jié)構(gòu)體不能被繼承

6.結(jié)構(gòu)體沒有析構(gòu)函數(shù)

7.結(jié)構(gòu)體中如果出現(xiàn)引用類型 副本中的變量和原件中的變量指向同一地址

8.結(jié)構(gòu)體不能標(biāo)記為靜態(tài)的

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容