枚舉:可以被窮舉的結(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)的