การทำความเข้าใจเกี่ยวกับแอตทริบิวต์ Flags
Enum ใน C#
ในโลกของการเขียนโปรแกรม โดยเฉพาะใน C# การจัดอันดับ (หรือ enums) เป็นวิธีที่ได้รับความนิยมในการกำหนดชุดของค่าคงที่ที่มีชื่อ อย่างไรก็ตาม คุณอาจพบกับ enums ที่มีการทำเครื่องหมายด้วยแอตทริบิวต์ Flags
และสงสัยว่ามันหมายถึงอะไรและจะใช้งานอย่างไรอย่างมีประสิทธิภาพ ในบล็อกโพสต์นี้ เราจะเจาะลึกถึงวัตถุประสงค์ของแอตทริบิวต์ [Flags]
ใน C# พร้อมทั้งเสนอตัวอย่างและคำอธิบายที่ชัดเจนเพื่อเสริมความเข้าใจของคุณ
แอตทริบิวต์ [Flags]
ทำงานอย่างไร?
แอตทริบิวต์ [Flags]
ใน C# คือแอตทริบิวต์พิเศษที่อนุญาตให้การจัดอันดับสามารถแทนค่ารวมกันได้ นี่มีประโยชน์อย่างยิ่งเมื่อจัดการกับตัวเลือกหรือการตั้งค่าหลายรายการในครั้งเดียว แทนที่จะใช้ค่าเดียว enums ที่ใช้แอตทริบิวต์ [Flags]
สามารถถือค่ารวมในรูปแบบบิตที่สามารถรวมกันหรือตรวจสอบได้อย่างมีประสิทธิภาพ
เมื่อใดควรใช้ [Flags]
?
แอตทริบิวต์ [Flags]
ควรนำไปใช้เมื่อค่าของ enum สามารถรวมเข้าด้วยกันเป็นกลุ่ม ซึ่งมักจะสอดคล้องกับการตั้งค่าหรือตัวเลือกที่สามารถอยู่ร่วมกันได้ Enums จะถูกกำหนดด้วยฐานสองซึ่งแทนบิตแต่ละบิต
ตัวอย่างการประกาศ Enum
นี่คือตัวอย่างการประกาศ enum โดยใช้แอตทริบิวต์ [Flags]
:
[Flags]
public enum Options
{
None = 0, // 0b0000 - ไม่มีตัวเลือกที่เลือก
Option1 = 1, // 0b0001 - ตัวเลือก 1
Option2 = 2, // 0b0010 - ตัวเลือก 2
Option3 = 4, // 0b0100 - ตัวเลือก 3
Option4 = 8 // 0b1000 - ตัวเลือก 4
}
การใช้การดำเนินการแบบบิต
จากการประกาศด้านบน คุณสามารถรวมค่าต่าง ๆ ด้วยตัวดำเนินการ OR แบบบิต (|
) ตัวอย่างเช่น:
var allowedOptions = Options.Option1 | Options.Option3;
ในกรณีนี้ allowedOptions
แสดงถึงทั้ง Option1
และ Option3
ข้อดีของแอตทริบิวต์ [Flags]
ความสามารถในการอ่านที่ดีขึ้น
หนึ่งในข้อได้เปรียบที่สำคัญที่สุดของการใช้แอตทริบิวต์ [Flags]
คือมันทำให้ผลลัพธ์ของวิธีการ .ToString()
อ่านได้ง่ายขึ้น พิจารณาตัวอย่างนี้:
var myOptions = Options.Option1 | Options.Option3;
Console.WriteLine(myOptions.ToString()); // ผลลัพธ์: "Option1, Option3"
ตรงกันข้าม หากคุณไม่ใช้แอตทริบิวต์ [Flags]
:
enum Suits { Spades = 1, Clubs = 2, Diamonds = 4, Hearts = 8 }
var mySuits = (Suits.Spades | Suits.Diamonds);
Console.WriteLine(mySuits.ToString()); // ผลลัพธ์: "5"
ข้อพิจารณาที่สำคัญ
-
ค่าต้องเป็นพลังของสอง: จำเป็นต้องกำหนดค่าของ enum เป็นพลังของสอง (1, 2, 4, 8 ฯลฯ) เพื่อการดำเนินการแบบบิตอย่างถูกต้อง หากไม่เป็นเช่นนั้น ผลลัพธ์อาจไม่คาดคิด
การประกาศที่ไม่ถูกต้อง:
[Flags]
public enum MyColors
{
Yellow, // 0
Green, // 1
Red, // 2
Blue // 3
}
สิ่งนี้จะทำให้ enum MyColors
ไม่เหมาะสมสำหรับการใช้งาน flag
ตัวอย่างการประกาศที่ถูกต้อง
[Flags]
public enum MyColors
{
Yellow = 1, // 0b0001
Green = 2, // 0b0010
Red = 4, // 0b0100
Blue = 8 // 0b1000
}
การตรวจสอบธง
คุณสามารถตรวจสอบได้อย่างง่ายดายว่าธงเฉพาะถูกตั้งค่าไว้หรือไม่ โดยใช้วิธีการ HasFlag()
:
if (allowedOptions.HasFlag(Options.Option1))
{
// Option1 ได้รับอนุญาต
}
ก่อน .NET 4 คุณสามารถใช้การดำเนินการ AND แบบบิตแทน:
if ((allowedOptions & Options.Option1) == Options.Option1)
{
// Option1 ได้รับอนุญาต
}
การทำความเข้าใจเกี่ยวกับค่า None
โดยทั่วไป ค่า None
ใน enums ที่มีการแต่งด้วย [Flags]
หมายความว่าไม่มีตัวเลือกใด ๆ ที่เลือก ซึ่งแทนค่าด้วยศูนย์ อย่างไรก็ตาม โปรดจำไว้ว่าการใช้ค่า None
ในการดำเนินการแบบบิตจะส่งผลให้เกิดศูนย์เสมอ ดังนั้นการเปรียบเทียบแบบเชิงตรรกะจึงเป็นที่นิยม:
if (allowedOptions == Options.None)
{
// ไม่มีตัวเลือกที่เลือก
}
สรุป
แอตทริบิวต์ [Flags]
นำความยืดหยุ่นและความชัดเจนในการทำงานกับ enums ใน C# โดยการอนุญาตให้คุณกำหนดการรวมของตัวเลือกและเพิ่มความสามารถในการอ่าน ทำให้มันเป็นเครื่องมือที่ทรงพลังในกล่องเครื่องมือของนักพัฒนา สำหรับการอ่านเพิ่มเติม คุณสามารถสำรวจความซับซ้อนเพิ่มเติมได้ที่ MSDN
การใช้แอตทริบิวต์ enum [Flags]
อย่างมีประสิทธิภาพสามารถปรับปรุงวิธีการจัดการตัวเลือกที่เกี่ยวข้องต่าง ๆ ในแอปพลิเคชัน C# ของคุณอย่างมาก