Enumeration

enum.cs

using System;

public class Hello
{
 
  
public enum ComputerStatus : byte 
{
        Using=5,
        Broken=6,
        Sole=7,
        Lost=8
   }

   public static void Main()
   {
         ComputerStatus My486, My586;
       My486 = ComputerStatus.Broken;
       My586 = (ComputerStatus)5;
       if (My486 == ComputerStatus.Using) {
            Console.WriteLine("Wow! Marathon!");
       } else {
            Console.WriteLine("Take it easy! rest in peace");
    }

    Console
.WriteLine(My486);

    }
}

DOS Prompt

C:\CS>enum
Take it easy! rest in peace
6

C:\CS>_

   เมื่อเวลาเราใช้ตัวแปร บางตัวแปรอาจจะมีเพียงค่าไม่กี่ค่าที่เป็นไปได้ เช่นเราอาจต้องการเก็บสถานะการผลิตสินค้า ก็จะมีเรียงตั้งแต่ รับ order แล้ว, ลงแผนงานการผลิตแล้ว, กำลังผลิต, รับเข้าคลังแล้ว และ สุดท้ายคือส่งแล้ว ถ้าคุณใช้ตัวเลขในการเก็บ เช่น ตั้งเป็น 1 หมายถึง รับ order แล้ว , 2 หมายถึง ลงแผนงานการผลิตแล้ว อย่างนี้เป็นต้น มันก็ดูยุ่งยากเวลาอ่าน พอ code ยาวๆ ก็จะงง ไม่รู้ว่า 1 คืออะไรอีก แต่ถ้าเก็บ เป็นตัวอักษรภาษาอังกฤษก็ดูดีขึ้นมาหน่อย แต่ถ้าคนอื่นมาอ่านก็จะงงอยู่ดี ถ้าจะเก็บเป็นคำภาษาอังกฤษ ก็เปลืองโดยใช้เหตุ และเสี่ยงกับการสะกดผิดบางตัว ทำให้เกิด Bug ที่หาเจอได้ยากอีก ดังนั้นทางภาษาคอมพิวเตอรต่างจึงออกแบบ enumeration มาแก้ปัญหาดังกล่าว
    enumeration เป็นการทำให้ดูเหมือนว่าเราสร้างชนิดใหม่ ลองดู code นี้ครับ

public enum ComputerStatus : byte {
        Using=5,
        Broken=6,
        Sole=7,
        Lost=8
}

   จากตัวอย่างนี้เป็นการสร้างชนิดตัวแปรใหม่ที่ชื่อว่า ComputerStatus จริงๆ แล้วไม่ใช่ตัวแปรชนิดใหม่หรอกครับ programmer ดูเหมือนเป็นชนิดใหม่ แต่ที่จริงแล้วการเก็บจริงๆ เป็นตัวเลข ในที่นี้กำหนดเป็น byte แต่ถ้าคุณ ไม่ระบุ : byte ตาม default จะเป็น int ชนิดตัวแปรที่สามารถใช้เป็น enumerator ได้ได้แก่ byte, sbyte, short, ushort, int, uint, long และ ulong ครับ
    ส่วนใน { } ก็ให้เราใส่คำที่เราอนุญาตให้เก็บในตัวแปรชนิดใหม่นี้ ตามตัวอย่างผมต้องการเก็บสถานะของเครื่องคอมพิวเตอร์ ว่า ใช้งานอยู่, เสีย, ขายไปแล้ว หรือหายถูกขโมย ผมจึงเขียนอย่างที่เห็นครับ  ส่วนตัวเลขที่ผมกำกับ เช่น Sole=7 นั้นหมายความว่าถ้าตัวแปรเก็บค่า Sole จริงๆ ให้เก็บค่า 7 ครับ เพื่อว่าจะเอาไปคำนวณอื่นๆ ได้ภายหลัง
    เราอาจจะไม่ระบุค่าตัวเลขก็ได้ครับ ตาม default จะเริ่มต้นที่ 0 และ ตัวต่อไปจะเป็นค่า 1 ตามลำดับ แต่ถ้าคุณระบุตัวเลขให้ Using เป็น 15 แต่ไม่ได้ระบุตัวที่เหลือ ค่าที่มันเก็บให้เป็น 16, 17 และ 18 ตามลำดับ

 ComputerStatus My486, My586;
 My486 = ComputerStatus.Broken;
 My586 = (ComputerStatus)5;

เมื่อเราสร้างชนิด ComputerStatus เสร็จ เราก็พร้อมใช้งาน เราสร้างตัวแปรจากมันเหมือนกับที่เราสร้างจากตัวแปรชนิดอื่นๆ จากนั้นเราสามารถใช้งานได้เลย ในตัวอย่างนี้ My486 ให้เป็นสถานะว่าพังแล้ว เราอาจ จะกำหนดจากตัวเลขไปใส่ได้ แต่ต้อง convert เป็นชนิดของ enumeration ก่อน ในตัวอย่างนี้ set ว่า My586 สถานะคือกำลังใช้งานอยู่ ในทางกลับกันถ้าคุณต้องการค่าที่เป็นตัวเลขออกจาก enumeration ให้ convert ให้มันเป็น ตัวเลขก่อน เช่น

int num = (int)My486;

แบบนี้  num จะเก็บค่า 6 ครับ

if (My486 == ComputerStatus.Using) { 

นี่เป็นตัวอย่างที่ใช้ในการเปรียบเทียบครับ จะเห็นได้ว่า code จะอ่านง่ายขึ้นเยอะครับ