Enums สามารถทำให้โค้ดอ่านง่ายขึ้น ยังมีบางสิ่งที่ต้องระวัง (ใน. net เป็นอย่างน้อย)
เนื่องจากหน่วยเก็บข้อมูลพื้นฐานของ enum เป็น int ค่าเริ่มต้นจะเป็นศูนย์ดังนั้นคุณควรตรวจสอบให้แน่ใจว่า 0 เป็นค่าเริ่มต้นที่เหมาะสม (เช่นโครงสร้างมีเขตข้อมูลทั้งหมดที่ตั้งค่าเป็นศูนย์เมื่อสร้างขึ้นดังนั้นจึงไม่มีวิธีใดที่จะระบุค่าเริ่มต้นอื่นนอกจาก 0 หากคุณไม่มีค่า 0 คุณจะไม่สามารถทดสอบ enum ได้โดยไม่ต้องแคสต์เป็น int ซึ่งจะเป็น รูปแบบที่ไม่ดี)
หาก enum ของคุณเป็นรหัสส่วนตัวของคุณ (ไม่เคยเปิดเผยต่อสาธารณะ) คุณสามารถหยุดอ่านได้ที่นี่
หาก enums ของคุณได้รับการเผยแพร่ไปยังโค้ดภายนอกในลักษณะใด ๆ และ / หรือถูกบันทึกไว้ภายนอกโปรแกรมให้พิจารณาการกำหนดหมายเลขให้ชัดเจน คอมไพเลอร์จะกำหนดหมายเลขจาก 0 โดยอัตโนมัติ แต่ถ้าคุณจัดเรียง enums ของคุณใหม่โดยไม่ให้ค่าเหล่านี้คุณอาจพบข้อบกพร่องได้
ฉันสามารถเขียนได้อย่างถูกกฎหมาย
WriteMode illegalButWorks = (WriteMode)1000000;
file.Write( data, illegalButWorks );
เพื่อต่อสู้กับสิ่งนี้รหัสใด ๆ ที่ใช้ enum ที่คุณไม่สามารถมั่นใจได้ (เช่น Public API) จำเป็นต้องตรวจสอบว่า enum ถูกต้องหรือไม่ คุณทำได้ผ่านทาง
if (!Enum.IsDefined(typeof(WriteMode), userValue))
throw new ArgumentException("userValue");
ข้อแม้เดียวEnum.IsDefined
คือใช้การสะท้อนและช้ากว่า นอกจากนี้ยังประสบปัญหาการกำหนดเวอร์ชัน หากคุณต้องการตรวจสอบค่า enum บ่อยๆคุณควรทำสิ่งต่อไปนี้:
public static bool CheckWriteModeEnumValue(WriteMode writeMode)
{
switch( writeMode )
{
case WriteMode.Append:
case WriteMode.OverWrite:
break;
default:
Debug.Assert(false, "The WriteMode '" + writeMode + "' is not valid.");
return false;
}
return true;
}
ปัญหาในการกำหนดเวอร์ชันคือโค้ดเก่าอาจรู้วิธีจัดการกับ 2 enums ที่คุณมีเท่านั้น หากคุณเพิ่มค่าที่สาม Enum.IsDefined จะเป็นจริง แต่โค้ดเก่าไม่จำเป็นต้องจัดการ อ๊ะ
มีความสนุกสนานมากยิ่งขึ้นที่คุณสามารถทำได้กับ[Flags]
enums และรหัสการตรวจสอบความถูกต้องนั้นแตกต่างกันเล็กน้อย
ฉันจะสังเกตด้วยว่าสำหรับการพกพาคุณควรใช้ call ToString()
on the enum และใช้Enum.Parse()
เมื่ออ่านกลับเข้ามาทั้งสองอย่างToString()
และEnum.Parse()
สามารถจัดการ[Flags]
enum ได้เช่นกันดังนั้นจึงไม่มีเหตุผลที่จะไม่ใช้มัน โปรดทราบว่านี่เป็นข้อผิดพลาดอีกประการหนึ่งเพราะตอนนี้คุณไม่สามารถเปลี่ยนชื่อ enum ได้โดยไม่ต้องทำลายรหัส
ดังนั้นบางครั้งคุณต้องชั่งน้ำหนักทั้งหมดข้างต้นเมื่อคุณถามตัวเองว่าฉันจะหนีไปได้ไหม?