enum的運(yùn)算通常涉及到位運(yùn)算(and、or、xor),按位運(yùn)算, 常使用flagsattribute 自定義屬性定義。flagsattribute 和 enum 的準(zhǔn)則:
只有要對(duì)數(shù)值執(zhí)行按位運(yùn)算(and、or、xor)時(shí)才對(duì)枚舉使用 flagsattribute 自定義屬性。
用 2 的冪(即 1、2、4、8 等)定義枚舉常量。這意味著組合的枚舉常量中的各個(gè)標(biāo)志都不重疊。
請(qǐng)考慮為常用標(biāo)志組合創(chuàng)建一個(gè)枚舉常量。例如,如果用于文件 i/o 操作的枚舉包含枚舉常量 read = 1 和 write = 2,請(qǐng)考慮創(chuàng)建枚舉常量 readwrite = read or write,該常量組合了 read 和 write 標(biāo)志。此外,在某些情況下,可能會(huì)將用于組合標(biāo)志的按位 or 運(yùn)算視為一種高級(jí)概念,在簡(jiǎn)單任務(wù)中不需要執(zhí)行此操作。
將負(fù)數(shù)定義為標(biāo)志枚舉常量時(shí)應(yīng)謹(jǐn)慎,因?yàn)楹芏鄻?biāo)志位置都可能設(shè)置為 1,這可能使您的代碼產(chǎn)生混淆并易于發(fā)生代碼錯(cuò)誤。
測(cè)試數(shù)值中是否已設(shè)置標(biāo)志的一種簡(jiǎn)便方法為:在數(shù)值和標(biāo)志枚舉常量之間執(zhí)行按位“與”操作,這種方法會(huì)將數(shù)值中與標(biāo)志不對(duì)應(yīng)的所有位都設(shè)置為零,然后測(cè)試該操作的結(jié)果是否等于該標(biāo)志枚舉常量。
將 none 用作值為零的標(biāo)志枚舉常量的名稱(chēng)。在按位 and 運(yùn)算中,不能使用 none 枚舉常量測(cè)試標(biāo)志,因?yàn)樗玫慕Y(jié)果始終為零。但是,您可以在數(shù)值與 none 枚舉常量之間執(zhí)行邏輯(不是按位)比較,以確定數(shù)值中是否已設(shè)置任何位。
如果創(chuàng)建的是值枚舉而不是標(biāo)志枚舉,創(chuàng)建 none 枚舉常量仍十分有用。原因是在默認(rèn)情況下,公共語(yǔ)言運(yùn)行庫(kù)會(huì)將用于枚舉的內(nèi)存初始化為零。因此,如果不定義值為零的常量,則枚舉在創(chuàng)建時(shí)將包含非法值。
如果明顯存在應(yīng)用程序需要表示的默認(rèn)情況,請(qǐng)考慮使用值為零的枚舉常量表示默認(rèn)值。如果不存在默認(rèn)情況,請(qǐng)考慮使用值為零的枚舉常量(這意味著該情況不由任何其他枚舉常量表示)。
不要僅為了反映枚舉自身的狀態(tài)而定義枚舉值。例如,不要定義僅用于標(biāo)記枚舉末尾的枚舉常量。如果需要確定枚舉的最后一個(gè)值,請(qǐng)顯式檢查該值。此外,如果枚舉常量范圍中的所有值都有效,還可以對(duì)第一個(gè)和最后一個(gè)枚舉常量執(zhí)行范圍檢查。
不要指定保留供將來(lái)使用的枚舉常量。
在定義采用枚舉常量作為值的方法或?qū)傩詴r(shí),應(yīng)考慮對(duì)該值進(jìn)行驗(yàn)證。原因是即使沒(méi)有在枚舉中定義某個(gè)數(shù)值,也可以將該數(shù)值強(qiáng)制轉(zhuǎn)換為枚舉類(lèi)型。
技巧1:如何去除一個(gè)枚舉項(xiàng):
例如定義了權(quán)限enum permission:
[flags]
public enum permission{
select = 1,
edit = 2,
delete = 4,
view = 8,
all = select | edit | delete | view
}
可以采用這個(gè)函數(shù)進(jìn)行計(jì)算:
public static permission clearflag(permission value, permission flag)
{
value = value & (permission.all^ flag);
return value;
}
新聞熱點(diǎn)
疑難解答
圖片精選