C# Enum (การแจงนับ) พร้อมตัวอย่าง

⚡ สรุปอย่างชาญฉลาด

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

  • 📐 ความหมาย: คำหลัก enum ใช้สำหรับจัดกลุ่มค่าคงที่ที่มีชื่อที่เกี่ยวข้องไว้ภายใต้ประเภทเดียวกัน โดยแทนที่ตัวเลขมหัศจรรย์ที่กระจัดกระจายด้วยตัวระบุที่อ่านง่าย
  • 🇧🇷 ตัวอย่างจำนวนวัน: ตัวแปรประเภท Days จะเก็บวันในสัปดาห์ และ Days.Sun จะส่งคืนสมาชิกที่เลือกโดยใช้ชื่อของสมาชิกนั้น
  • 🔢 คุณค่าพื้นฐาน: สมาชิกของ Enum จะแมปกับค่าจำนวนเต็มซึ่งเริ่มต้นที่ศูนย์และเพิ่มขึ้นทีละหนึ่ง เว้นแต่จะมีการกำหนดหมายเลขที่กำหนดเอง
  • 🔁 การแปลง: การแปลงประเภทข้อมูลแบบระบุชัดเจนจะแปลง enum ให้เป็นจำนวนเต็ม ในขณะที่ Enum.Parse และ Enum.TryParse จะแปลงข้อความกลับไปเป็นสมาชิกอีกครั้ง
  • 🚩 ธง: แอตทริบิวต์ Flags ช่วยให้ enum หนึ่งตัวสามารถรวมตัวเลือกหลายตัวเข้าด้วยกันเป็นฟิลด์บิตโดยใช้ตัวดำเนินการ OR แบบบิตได้
  • 🤖 ความช่วยเหลือจากเอไอ: GitHub Copilot และ ML.NET ช่วยสร้างคำจำกัดความของ enum และแมปอุมกับฟีเจอร์การเรียนรู้ของเครื่อง

Enum (การแจงนับ) ใน C#

การแจงนับ C#

การแจงนับใช้ในภาษาการเขียนโปรแกรมใดๆ เพื่อกำหนดชุดค่าคงที่ ตัวอย่างเช่น สามารถกำหนดวันในสัปดาห์เป็นการแจงนับและนำไปใช้ที่ใดก็ได้ในโปรแกรม ใน C# การแจงนับถูกกำหนดด้วยความช่วยเหลือของคำหลัก 'enum'

มาดูตัวอย่างว่าเราสามารถใช้คำหลัก 'enum' ได้อย่างไร

ในตัวอย่างของเรา เราจะกำหนดการแจงนับที่เรียกว่าวัน ซึ่งจะใช้ในการจัดเก็บวันในสัปดาห์ สำหรับแต่ละตัวอย่าง เราจะแก้ไขเฉพาะฟังก์ชันหลักในไฟล์ Program.cs ของเรา

การแจงนับ C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DemoApplication
{
 class Program 
 {
  enum Days{Sun,Mon,tue,Wed,thu,Fri,Sat};
  
  static void Main(string[] args) 
  {
   Console.Write(Days.Sun);
   
   Console.ReadKey();
  }
 }
}

Code คำอธิบาย:-

  1. 'อีนัม' ประเภทข้อมูล ถูกกำหนดให้ประกาศแจงนับ ชื่อของการแจงนับคือวัน วันทั้งหมดของสัปดาห์จะถูกระบุเป็นค่าของการแจงนับ
  2. ในที่สุดฟังก์ชัน console.write จะใช้เพื่อแสดงค่าใดค่าหนึ่งของการแจงนับ

หากป้อนโค้ดด้านบนถูกต้องแล้วและโปรแกรมทำงานสำเร็จจะแสดงผลลัพธ์ต่อไปนี้

Output:

การแจงนับ C#

จากเอาต์พุต คุณจะเห็นได้ว่าค่า 'Sun' ของการแจงนับจะปรากฏในคอนโซล

เหตุใดจึงต้องใช้ Enum ใน C#?

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

  • การอ่าน: ชื่ออย่าง Days.Fri นั้นชัดเจนกว่าเลข 5 มาก ดังนั้นใครก็ตามที่อ่านโค้ดก็จะเข้าใจความหมายได้ทันที
  • ความปลอดภัยประเภท: ตัวแปรที่ประกาศด้วยประเภท enum จะเก็บค่าได้เพียงค่าเดียวจากสมาชิกที่กำหนดไว้เท่านั้น ซึ่งจะช่วยป้องกันไม่ให้ค่าที่ไม่ถูกต้องหลุดรอดไปได้ping มา
  • การบำรุงรักษา: ค่าคงที่ที่เกี่ยวข้องจะอยู่ในที่เดียวกัน ดังนั้นการเพิ่มหรือเปลี่ยนชื่อค่าจะอัปเดตโปรแกรมทั้งหมดอย่างสม่ำเสมอ
  • การผูกข้อมูล: เฟรมเวิร์กต่างๆ เช่น WPF และ ASP.NET สามารถผูกค่า enum กับรายการแบบดรอปดาวน์ได้ ซึ่งทำให้ enum มีประโยชน์สำหรับการสร้างส่วนติดต่อผู้ใช้

เนื่องจากคอมไพเลอร์จะตรวจสอบทุกการกำหนดค่ากับสมาชิกที่อนุญาต ดังนั้น enum จึงช่วยตรวจจับข้อผิดพลาดได้ตั้งแต่เนิ่นๆ ก่อนที่โปรแกรมจะเริ่มทำงาน

การกำหนดค่าแบบกำหนดเองให้กับ Enum ใน C#

โดยค่าเริ่มต้น C# จะกำหนดค่า 0 ให้กับสมาชิกตัวแรกของ enum และเพิ่มค่าของสมาชิกถัดไปทีละหนึ่ง ใน enum Days ข้างต้น Sun เท่ากับ 0, Mon เท่ากับ 1 และ Sat เท่ากับ 6 คุณสามารถแทนที่ค่าเริ่มต้นเหล่านี้ได้โดยการกำหนดค่าตัวเลขที่ชัดเจน

  • ค่าที่ระบุอย่างชัดเจน: การเขียน enum Level {Low = 1, Medium = 5, High = 10} จะกำหนดค่าให้กับสมาชิกแต่ละตัวเป็นตัวเลขที่เลือกไว้ แทนที่จะใช้ลำดับค่าเริ่มต้น
  • งานที่ได้รับมอบหมายบางส่วน: หากคุณกำหนดค่าให้กับสมาชิกเพียงบางส่วนเท่านั้น คอมไพเลอร์จะนับเลขจากค่าสุดท้ายที่กำหนดให้กับสมาชิกที่เหลือ
  • ประเภทพื้นฐาน: โดยค่าเริ่มต้น enum จะเก็บค่าสมาชิกเป็น int แต่คุณสามารถเปลี่ยนเป็น byte, short หรือ long เพื่อประหยัดหน่วยความจำหรือขยายช่วงค่าได้

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

วิธีการแปลง Enum ใน C# เป็น int, string และ Flags

ภาษา C# มักต้องการแปลงค่า enum ไปเป็นรูปแบบอื่น เช่น การจัดเก็บเป็นตัวเลข หรือการอ่านค่ากลับมาจากข้อความ การแปลงเหล่านี้เกิดขึ้นได้ด้วยวิธีมาตรฐานไม่กี่วิธี

  • แปลง Enum เป็น int: การแปลงประเภทข้อมูลอย่างชัดเจน เช่น (int)Days.Wed จะส่งคืนค่าจำนวนเต็มที่อยู่เบื้องหลัง ซึ่งมีประโยชน์สำหรับการจัดเก็บหรือการคำนวณทางคณิตศาสตร์
  • แปลงจำนวนเต็มเป็น enum: การแปลงในทิศทางตรงกันข้าม เช่น (Days)3 จะแปลงตัวเลขกลับไปเป็นสมาชิก enum ที่ตรงกัน
  • แปลงสตริงเป็น enum: Enum.Parse และ Enum.TryParse ที่ปลอดภัยกว่า จะแปลงชื่อ เช่น “Fri” ให้เป็นสมาชิก Days.Fri โดยไม่แสดงข้อผิดพลาดข้อความไม่ถูกต้อง
  • แปลงค่า Enum เป็นสตริง: การเรียกใช้เมธอด ToString() บนสมาชิกใดๆ จะส่งคืนชื่อของสมาชิกนั้น ดังนั้น Days.Sun.ToString() จะส่งคืน “Sun” สำหรับแสดงผลหรือบันทึกข้อมูล
  • รายชื่อสมาชิก: Enum.GetValues ​​และ Enum.GetNames จะส่งคืนค่าหรือชื่อทั้งหมด ซึ่งเป็นประโยชน์เมื่อต้องการเติมข้อมูลลงในเมนูหรือตรวจสอบความถูกต้องของข้อมูลที่ป้อน

เมื่อต้องการแสดง enum ที่ประกอบด้วยตัวเลือกหลายตัวเลือกแทนที่จะเป็นตัวเลือกเดียว ให้ใช้แอตทริบิวต์ Flags และกำหนดค่าให้กับสมาชิกแต่ละตัวเป็นกำลังสอง เช่น 1, 2, 4 และ 8 จากนั้นคุณสามารถรวมสมาชิกเข้าด้วยกันโดยใช้ตัวดำเนินการ OR แบบบิต และทดสอบตัวเลือกเฉพาะโดยใช้เมธอด HasFlag

เทคนิคการแปลงเหล่านี้ช่วยให้ enum สามารถเคลื่อนย้ายได้อย่างราบรื่นระหว่างชื่อที่อ่านง่าย ตัวเลขที่จัดเก็บ และชุดแฟล็กที่รวมกันping ส่วนที่เหลือของโปรแกรมนั้นปลอดภัยต่อการพิมพ์และเข้าใจง่าย

คำถามที่พบบ่อย

ตัวแปร enum จะมีค่าเริ่มต้นเป็น 0 ซึ่งเป็นค่าที่แมปกับสมาชิกใดก็ตามที่เท่ากับ 0 หากไม่มีสมาชิกใดเป็น 0 ตัวแปรก็จะยังคงมีค่าเป็น 0 ดังนั้นนักพัฒนาจึงมักกำหนดสมาชิกประเภท None หรือ Unknown ไว้ก่อนเพื่อหลีกเลี่ยงความสับสน

ตัวแปรประเภท `const` กำหนดค่าที่มีชื่อเพียงค่าเดียว ในขณะที่ `enum` จัดกลุ่มค่าคงที่ที่มีชื่อที่เกี่ยวข้องไว้ภายใต้ประเภทเดียว นอกจากนี้ `enum` ยังเพิ่มความปลอดภัยของประเภท เนื่องจากตัวแปรสามารถเก็บค่าได้เพียงค่าเดียวจากสมาชิกที่กำหนดไว้ใน enum เท่านั้น

ใช่แล้ว สามารถประกาศ enum ภายใน namespace หรือซ้อนอยู่ภายใน class หรือ struct ได้ ซึ่งจะจำกัดขอบเขตการใช้งานให้อยู่เฉพาะประเภทนั้นๆ อย่างไรก็ตาม C# ไม่อนุญาตให้ประกาศ enum ภายในเนื้อหาของเมธอด

ใช่ สมาชิกสองตัวขึ้นไปอาจใช้หมายเลขพื้นฐานเดียวกัน ทำให้ชื่อที่ได้ในภายหลังเป็นชื่อแทนของชื่อแรก การเปรียบเทียบจะถือว่าทั้งสองชื่อเท่ากัน และการแปลงค่าดังกล่าวเป็นสตริงจะคืนค่าชื่อที่กำหนดไว้ใน enum เป็นชื่อแรก

enum เป็นชนิดข้อมูลแบบค่า (value type) ดังนั้นจึงจัดเก็บข้อมูลโดยตรง แทนที่จะจัดเก็บเป็นแบบอ้างอิงบนฮีป (heap) มันสืบทอดมาจาก System.Enum แต่ทำงานเหมือนชนิดข้อมูลจำนวนเต็ม (integral type) ซึ่งทำให้การคัดลอกและเปรียบเทียบค่า enum ทำได้อย่างรวดเร็ว

ใช่ ใน ML.NET คุณสามารถแมป enum กับฟีเจอร์หรือป้ายกำกับแบบจัดหมวดหมู่ได้ โดยส่วนใหญ่มักทำโดยการแปลงเป็นค่าจำนวนเต็มหรือการเข้ารหัสแบบ one-hot enum ที่มีการกำหนดประเภทอย่างชัดเจนจะช่วยให้คอลัมน์อินพุตของไปป์ไลน์การเรียนรู้ของเครื่องมีความชัดเจนและสอดคล้องกัน

ใช่แล้ว GitHub Copilot แนะนำให้ใช้คำจำกัดความ enum ที่สมบูรณ์ ค่าที่กำหนดเอง คุณลักษณะ Flags และตัวช่วยในการแปลง เช่น Enum.TryParse ภายใน Visual Studio และ VS Code. Revตรวจสอบคำแนะนำแต่ละรายการ เนื่องจาก Copilot อาจเลือกค่าหรือชื่อที่ไม่ตรงกับโดเมนของคุณ

ใช้เมธอด Enum.IsDefined ซึ่งจะคืนค่า true เมื่อตัวเลขหรือชื่อที่กำหนดตรงกับสมาชิกที่กำหนดไว้ การใช้ร่วมกับ Enum.TryParse จะช่วยให้คุณตรวจสอบความถูกต้องของข้อมูลที่ผู้ใช้ป้อนได้อย่างปลอดภัยก่อนที่จะแปลงข้อความเป็นค่า enum

สรุปโพสต์นี้ด้วย: