ฉันกำลังอ่าน enums และพบว่ามันคล้ายกับการประกาศค่าคงที่ ฉันจะรู้ได้อย่างไรว่าเมื่อใดควรใช้ค่าคงที่แทนที่จะใช้ enum หรือในทางกลับกัน ข้อดีของการใช้ enums คืออะไร?
ฉันกำลังอ่าน enums และพบว่ามันคล้ายกับการประกาศค่าคงที่ ฉันจะรู้ได้อย่างไรว่าเมื่อใดควรใช้ค่าคงที่แทนที่จะใช้ enum หรือในทางกลับกัน ข้อดีของการใช้ enums คืออะไร?
คำตอบ:
ใช้ enums เมื่อคุณต้องการกำหนดช่วงของค่าที่สามารถเป็นได้ สีเป็นตัวอย่างที่ชัดเจนเช่น:
public enum Colour
{
White,
Red,
Blue
}
หรืออาจจะเป็นชุดของสิ่งที่เป็นไปได้เช่น: (ตัวอย่างที่ฉันขโมยมาจากที่นี่เพราะฉันขี้เกียจ)
[FlagsAttribute]
enum DistributedChannel
{
None = 0,
Transacted = 1,
Queued = 2,
Encrypted = 4,
Persisted = 16,
FaultTolerant = Transacted | Queued | Persisted
}
ค่าคงที่ควรเป็นค่าเดียวเช่น PI ไม่มีช่วงของค่า PI มีเพียง PI
ประเด็นอื่น ๆ ที่ควรพิจารณา ได้แก่ :
Type Safety"
สิ่งที่ขาดหายไปจากคำตอบอื่น ๆ คือ enums มีประเภทฐานจำนวนเต็ม คุณสามารถเปลี่ยนค่าเริ่มต้นจาก int เป็นประเภทอินทิกรัลอื่น ๆ ยกเว้นถ่านเช่น:
enum LongEnum : long {
foo,
bar,
}
คุณสามารถแคสต์อย่างชัดเจนและโดยปริยายไปยังประเภทพื้นฐานซึ่งมีประโยชน์ในการสลับคำสั่ง ระวังว่าเราสามารถโยนค่าของประเภทฐานเป็น enum ได้แม้ว่า enum จะไม่มีสมาชิกที่มีค่าที่เหมาะสมก็ตาม ดังนั้นการใช้ส่วนเริ่มต้นเสมอในสวิตช์จึงเป็นความคิดที่ดี BTW, .NET เองอนุญาตให้ใช้แม้กระทั่งจุดลอยตัวที่มีค่า แต่คุณไม่สามารถกำหนดได้ใน C # แม้ว่าฉันคิดว่าคุณยังสามารถใช้งานได้ (ยกเว้นในสวิตช์)
นอกจากนี้การใช้ enums ยังช่วยให้คุณปลอดภัยมากขึ้น ถ้าคุณตั้งใจจะใช้ค่าคงที่เช่น int เป็นพารามิเตอร์ของเมธอดฉันสามารถเรียก method ด้วยค่า int ใดก็ได้ จริงอยู่ที่การแคสต์มันสามารถเกิดขึ้นได้กับ enums เช่นกัน แต่จะไม่เกิดขึ้นโดยบังเอิญ ที่แย่กว่านั้นคือความเป็นไปได้ที่จะทำให้ลำดับของพารามิเตอร์สับสน
void method(int a, int b) {...}
ถ้าค่าคงที่ A เท่านั้นอาจไปเป็น a และค่าคงที่ B เท่านั้นที่สามารถไปเป็น b ได้ดังนั้นการใช้ enum สองประเภทที่แตกต่างกันจะทำให้พบการใช้ผิดประเภทใด ๆ ในระหว่างการรวบรวม
ค่าคงที่เป็นคุณลักษณะของภาษาที่บอกว่าตัวแปรจะไม่เปลี่ยนค่า (ดังนั้นคอมไพเลอร์สามารถทำการเพิ่มประสิทธิภาพเกี่ยวกับความรู้นั้นได้) โดยที่ enum เป็นประเภทเฉพาะ
ค่าคงที่อาจเป็นชนิดข้อมูลใดก็ได้ แต่ enum เป็น enum
ฉันใช้ enum ที่ใดก็ได้ที่คุณสามารถมีตัวเลือกมากมายและต้องการปรับปรุงความสามารถในการอ่านโค้ด กล่าวคือคุณสามารถมีระดับการติดตามเป็น int ที่มีค่า 0, 1, 2 หรือเป็น enum เป็นข้อผิดพลาดคำเตือนและข้อมูล
Enum ยังมีความสามารถในการใช้เป็นตัวดำเนินการระดับบิตเช่น FontStyle.Bold | FontStyle Italic จะทำให้คุณมีฟอนต์ตัวหนาและตัวเอียง
นอกจากคำตอบของ Robert:
ใช้ enum สำหรับชุดค่าที่มีชื่อ จำกัด คุณไม่ค่อยสนใจเกี่ยวกับค่าตัวเลขที่อยู่ด้านหลังสัญลักษณ์แต่ละตัว (แต่คุณยังมีความสามารถในการกำหนดค่าได้เช่นเพื่อให้เข้ากันได้กับระบบเดิม)
Robert: ใช่ Enum สามารถใช้เป็นช่องบิตได้ ใช้แอตทริบิวต์Flags (และตรวจสอบให้แน่ใจว่าสมาชิกของ enum มีค่าตัวเลขที่เหมาะสม)
ค่าคงที่ AC # คล้ายกับตัวแปรที่ให้ชื่อที่กำหนดให้กับค่า อย่างไรก็ตามค่าคงที่แตกต่างจากตัวแปรมาตรฐานเนื่องจากเมื่อกำหนดแล้วค่าที่กำหนดให้กับค่าคงที่จะไม่สามารถเปลี่ยนแปลงได้ ประโยชน์หลักของค่าคงที่คือความช่วยเหลือในการสร้างรหัสการจัดทำเอกสารด้วยตนเองรวมทั้งอนุญาตให้มีการประกาศค่าคีย์ในที่เดียวซึ่งช่วยให้การบำรุงรักษาง่ายขึ้นหากจำเป็นต้องอัปเดตค่าและคอมไพล์ซอฟต์แวร์อีกครั้ง
ในขณะที่รายการ Enumerator มีประโยชน์สำหรับการกำหนดลำดับและสถานะโดยเฉพาะอย่างยิ่งเมื่อมีความก้าวหน้าตามธรรมชาติผ่านสถานะเหล่านั้น เนื่องจากค่าคงที่แต่ละค่าในรายการสามารถจัดรูปแบบและเปรียบเทียบได้โดยใช้ชื่อหรือค่า นอกจากนี้ยังสามารถใช้ enum เพื่อกำหนดชุดค่าที่ถูกต้องได้อย่าง จำกัด
สิ่งหนึ่งที่ฉันพบว่ามีประโยชน์เมื่อใช้enum
แทนconst
ก็คือคุณสามารถวนซ้ำผ่านค่าใน an enum
ได้ยากกว่ามากที่จะทำเช่นนั้นกับconst
ค่า
หากคุณต้องการค่าตามจำนวนเต็มให้ใช้ enums หากคุณต้องการค่าตามสตริงให้ใช้โครงสร้างที่มีค่าคงที่
เมื่อคุณมีสิ่งที่ชอบ
class x
{
public string string_value {get;set;}
publi int int_value {get;set;}
}
x model = new x();
model.string_value = struct.some_value;
model.int_value = enum.some_value;