關於enum的那些事兒

2021-09-08 20:50:27 字數 3448 閱讀 8369

自從當年明月的《明朝的那些事兒》爆紅之後,以***那些事兒命名的文章便層出不窮。個人認為,這樣的命名通俗但具有吸引力,容易接地氣。哈哈,所以我也寫了幾篇以《***那些事兒》的文章。當然這篇文章也是為了保持隊形,勿怪,看內容。

在c#的官方文件中給出這樣的解釋:

enum關鍵字用於宣告列舉,即一種由一組稱為列舉數列表的命名常量組成的獨特型別。

通常情況下,最好是在命名空間內直接定義列舉,以便該命名空間中的所有類都能夠同樣方便地訪問它。但是,還可以將列舉巢狀在類或結構中。

預設情況下,第乙個列舉數的值為 0,後面每個列舉數的值依次遞增 1。例如,下面的列舉,sat 是 0,sun 是 1,mon 是 2 等.

enum days ;

如下面的示例所示列舉數可用初始值來重寫預設值。

enum days ;

在此列舉中,強制元素序列從 1 而不是 0 開始。但是,一般建議包括值為 0 的常量。

每種列舉型別都有基礎型別,該型別可以是除 char 以外的任何整型。列舉元素的預設基礎型別為 int。要宣告另一整型列舉(如 byte),請在識別符號之後緊跟型別,然後再使用冒號,如下面的示例所示。

enum days : byte ;

准許使用的列舉型別有byte、sbyte、short、ushort、int、uint、long 或 ulong。

可以給days型別的變數賦以基礎型別範圍內的任何值,所賦的值不限於已命名的常數。

enum e的預設值為表示式(e)0生成的值。

基礎型別指定為每個列舉數分配的儲存大小。但是,從enum型別到整型的轉換需要用顯式型別轉換來完成。例如,下面的語句使用強制轉換(從enum轉換為int)將列舉數 sun 賦值給乙個 int 型別的變數。

int x = (int)days.sun;

可以使用列舉型別定義位標誌,從而使該列舉型別的例項可以儲存列舉數列表中定義的值的任意組合。

建立位標誌列舉的方法是應用system.flagsattribute特性並適當定義一些值,以便可以對這些值執行andornotxor按位運算。 在位標誌列舉中包含乙個值為零(表示「未設定任何標誌」)的命名常量。如果零值不表示「未設定任何標誌」,則請不要為標誌指定零值。

在下面的示例中,定義了 days 列舉的另乙個版本,命名為 days2。 days2 具有 flags 特性,且它的每個值都是 2 的若干次冪,指數依次遞增。 這樣,您將能夠建立值為 days2.tuesday 和 days2.thursday 的 days2 變數。

enum

days2

class

myclass

若要在某個列舉上設定標誌,請使用按位or運算子,如下面的示例所示:

//

initialize with two flags using bitwise or.

meetingdays = days2.tuesday |days2.thursday;

//set an additional flag using bitwise or.

meetingdays = meetingdays |days2.friday;

console.writeline(

"meeting days are

", meetingdays);

//output: meeting days are tuesday, thursday, friday

//remove a flag using bitwise xor.

meetingdays = meetingdays ^days2.tuesday;

console.writeline(

"meeting days are

", meetingdays);

//output: meeting days are thursday, friday

若要確定了是否設定了特定標誌,請使用按位and運算,如下面的示例所示:

//

test value of flags using bitwise and.

bool test = (meetingdays & days2.thursday) ==days2.thursday;

console.writeline(

"thursday a meeting day.

", test == true ? "

is" : "

is not");

//output: thursday is a meeting day.

enum

days ;

enum months : byte

; days today =days.monday;

int daynumber =(int

)today;

console.writeline(

" is day number #.

", today, daynumber);

months thismonth =months.dec;

byte monthnumber = (byte

)thismonth;

console.writeline(

" is month number #.

", thismonth, monthnumber);

輸出:

monday is day number #1.

dec is month number #11.

enum

dayworkday;

enum

fruit

;int

main()

不同列舉定義的型別元素,要進行相互賦值,必須進行強制型別轉換。在day中,saturday的值為0。因為saturday後面有sunday=0,列舉值最小為0。但是enum型別的列舉值向int的轉化是隱式進行的,無須強制轉換。

相對於c#中的enum,c++的enum有3個缺陷:

1)列舉值是常量,不是變數,所以不能在程式中用賦值語句對其賦值。

例如:saturday = 1;//error

sunday = 4;//error

monday = thursday;//error

2)列舉元素本身由系統定義了乙個表示序號的數值,預設從0開始定義。例如在fruit中:

3)只能把用一型別的列舉值賦給列舉變數,不能把元素的值直接賦給列舉變數。

例如在程式中:

workday = saturday;

關於Python那些事兒

1.易於學習 python有相對較少的關鍵字,結構簡單,和乙個明確定義的語法,學習起來更加簡單。2.易於閱讀 python 定義的更清晰。3.易於維護 python的成功在於它的源 是相當容易維護的。4.乙個廣泛的標準庫 python的最大的優勢之一是豐富的庫,跨平台的,在unix,windows和...

關於Nginx那些事兒

記憶體少 併發能力強,效能優化 正向 在瀏覽器中配置 伺服器,實現客戶端對伺服器的訪問。也就是說,在一般情況下,我們客戶端無法直接訪問到伺服器,需要有那麼乙個中臺作為中間應用實現訪問。反向 反向 中,客戶端是無知的,不知道是否配置了伺服器,我們將資料發到反向 伺服器上去,反向 伺服器選擇目標伺服器獲...

關於BOM的那些事兒

window物件 1.window物件是最頂層的物件 2.window物件有六大屬性,這六大屬性本身也是物件 3.window物件旗下的document也是物件 並且document旗下有五大屬性 4.document旗下的五大屬性又是物件,總結 都是物件 window screenleft 和 s...