Enums และค่าคงที่ จะใช้เมื่อใด


97

ฉันกำลังอ่าน enums และพบว่ามันคล้ายกับการประกาศค่าคงที่ ฉันจะรู้ได้อย่างไรว่าเมื่อใดควรใช้ค่าคงที่แทนที่จะใช้ enum หรือในทางกลับกัน ข้อดีของการใช้ enums คืออะไร?



โปรดดูstackoverflow.com/questions/11575376/…สำหรับคำถามที่คล้ายกันสำหรับ Java (คำตอบส่วนใหญ่ใช้กับ C # ด้วย)
Alexei Levenkov

คำตอบ:


98

ใช้ 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

ประเด็นอื่น ๆ ที่ควรพิจารณา ได้แก่ :

  • a: ค่าคงที่ไม่จำเป็นต้องบ่งบอกถึงความสัมพันธ์ระหว่างค่าคงที่ในขณะที่การแจงนับบ่งชี้ว่าบางสิ่งอาจเป็นหนึ่งในเซตที่กำหนดโดย enum
  • b: การแจงนับที่กำหนดสามารถช่วยคุณในการตรวจสอบประเภทเมื่อใช้เป็นอาร์กิวเมนต์ ค่าคงที่เป็นเพียงค่าดังนั้นจึงไม่ให้ข้อมูลเชิงความหมายเพิ่มเติม

1
เกิดอะไรขึ้นถ้าคุณท้ายใช้.ToString()ใน enum มาก, ค่าใด ๆ ในการใช้ชั้นเรียนกับสตริง const ที่มีลักษณะและการกระทำเช่น enum แต่หลีกเลี่ยงการเรียกร้องให้ToString()? ตัวอย่าง
สินจัย

รอฉันคิดว่าฉันตอบคำถามของตัวเอง โค้ดในตัวอย่างนั้นใช้ไม่ได้: คุณต้องรับอินพุตเป็นสตริงซึ่งจะไม่ทำงานเหมือน enum
สินจัย

1
ทำไมคุณถึงไม่มีสีคลาสคงที่ที่มีสีคงที่แทนที่จะเป็น enum อะไรคือความแตกต่าง?
WDUK

ในข้อความสั้น ๆType Safety"
ahmednabil88

31

สิ่งที่ขาดหายไปจากคำตอบอื่น ๆ คือ 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 สองประเภทที่แตกต่างกันจะทำให้พบการใช้ผิดประเภทใด ๆ ในระหว่างการรวบรวม


21

ค่าคงที่เป็นคุณลักษณะของภาษาที่บอกว่าตัวแปรจะไม่เปลี่ยนค่า (ดังนั้นคอมไพเลอร์สามารถทำการเพิ่มประสิทธิภาพเกี่ยวกับความรู้นั้นได้) โดยที่ enum เป็นประเภทเฉพาะ

ค่าคงที่อาจเป็นชนิดข้อมูลใดก็ได้ แต่ enum เป็น enum

ฉันใช้ enum ที่ใดก็ได้ที่คุณสามารถมีตัวเลือกมากมายและต้องการปรับปรุงความสามารถในการอ่านโค้ด กล่าวคือคุณสามารถมีระดับการติดตามเป็น int ที่มีค่า 0, 1, 2 หรือเป็น enum เป็นข้อผิดพลาดคำเตือนและข้อมูล

Enum ยังมีความสามารถในการใช้เป็นตัวดำเนินการระดับบิตเช่น FontStyle.Bold | FontStyle Italic จะทำให้คุณมีฟอนต์ตัวหนาและตัวเอียง


8

นอกจากคำตอบของ Robert:

  1. ใช้ enum สำหรับชุดค่าที่มีชื่อ จำกัด คุณไม่ค่อยสนใจเกี่ยวกับค่าตัวเลขที่อยู่ด้านหลังสัญลักษณ์แต่ละตัว (แต่คุณยังมีความสามารถในการกำหนดค่าได้เช่นเพื่อให้เข้ากันได้กับระบบเดิม)

  2. Robert: ใช่ Enum สามารถใช้เป็นช่องบิตได้ ใช้แอตทริบิวต์Flags (และตรวจสอบให้แน่ใจว่าสมาชิกของ enum มีค่าตัวเลขที่เหมาะสม)


3

ค่าคงที่ AC # คล้ายกับตัวแปรที่ให้ชื่อที่กำหนดให้กับค่า อย่างไรก็ตามค่าคงที่แตกต่างจากตัวแปรมาตรฐานเนื่องจากเมื่อกำหนดแล้วค่าที่กำหนดให้กับค่าคงที่จะไม่สามารถเปลี่ยนแปลงได้ ประโยชน์หลักของค่าคงที่คือความช่วยเหลือในการสร้างรหัสการจัดทำเอกสารด้วยตนเองรวมทั้งอนุญาตให้มีการประกาศค่าคีย์ในที่เดียวซึ่งช่วยให้การบำรุงรักษาง่ายขึ้นหากจำเป็นต้องอัปเดตค่าและคอมไพล์ซอฟต์แวร์อีกครั้ง

ในขณะที่รายการ Enumerator มีประโยชน์สำหรับการกำหนดลำดับและสถานะโดยเฉพาะอย่างยิ่งเมื่อมีความก้าวหน้าตามธรรมชาติผ่านสถานะเหล่านั้น เนื่องจากค่าคงที่แต่ละค่าในรายการสามารถจัดรูปแบบและเปรียบเทียบได้โดยใช้ชื่อหรือค่า นอกจากนี้ยังสามารถใช้ enum เพื่อกำหนดชุดค่าที่ถูกต้องได้อย่าง จำกัด


3

สิ่งหนึ่งที่ฉันพบว่ามีประโยชน์เมื่อใช้enumแทนconstก็คือคุณสามารถวนซ้ำผ่านค่าใน an enumได้ยากกว่ามากที่จะทำเช่นนั้นกับconstค่า


0

หากคุณต้องการค่าตามจำนวนเต็มให้ใช้ 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;
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.