[Flags]
แอตทริบิวต์ควรจะใช้เมื่อใดก็ตามที่นับหมายถึงคอลเลกชันของค่าที่เป็นไปได้มากกว่าค่าเดียว คอลเลกชันดังกล่าวมักใช้กับตัวดำเนินการระดับบิตตัวอย่างเช่น:
var allowedColors = MyColor.Red | MyColor.Green | MyColor.Blue;
โปรดทราบว่า[Flags]
แอตทริบิวต์ไม่ได้เปิดใช้งานด้วยตัวเอง - สิ่งที่ทำคืออนุญาตให้มีการแสดงที่ดีโดย.ToString()
วิธีการ:
enum Suits { Spades = 1, Clubs = 2, Diamonds = 4, Hearts = 8 }
[Flags] enum SuitsFlags { Spades = 1, Clubs = 2, Diamonds = 4, Hearts = 8 }
...
var str1 = (Suits.Spades | Suits.Diamonds).ToString();
// "5"
var str2 = (SuitsFlags.Spades | SuitsFlags.Diamonds).ToString();
// "Spades, Diamonds"
นอกจากนี้ยังเป็นสิ่งสำคัญที่จะต้องทราบ[Flags]
ว่าไม่ได้ทำให้พลังค่า enum ของทั้งสองโดยอัตโนมัติ หากคุณเว้นค่าตัวเลข enum จะไม่ทำงานอย่างที่คาดไว้ในการดำเนินการระดับบิตเนื่องจากโดยค่าเริ่มต้นค่าเริ่มต้นด้วย 0 และเพิ่มขึ้น
ประกาศไม่ถูกต้อง:
[Flags]
public enum MyColors
{
Yellow, // 0
Green, // 1
Red, // 2
Blue // 3
}
ค่าถ้าประกาศด้วยวิธีนี้จะเป็นสีเหลือง = 0, สีเขียว = 1, สีแดง = 2, สีน้ำเงิน = 3 สิ่งนี้จะทำให้มันไร้ประโยชน์ในฐานะธง
นี่คือตัวอย่างของการประกาศที่ถูกต้อง:
[Flags]
public enum MyColors
{
Yellow = 1,
Green = 2,
Red = 4,
Blue = 8
}
เพื่อดึงค่าที่แตกต่างในทรัพย์สินของคุณคุณสามารถทำได้:
if (myProperties.AllowedColors.HasFlag(MyColor.Yellow))
{
// Yellow is allowed...
}
หรือก่อนหน้า. NET 4:
if((myProperties.AllowedColors & MyColor.Yellow) == MyColor.Yellow)
{
// Yellow is allowed...
}
if((myProperties.AllowedColors & MyColor.Green) == MyColor.Green)
{
// Green is allowed...
}
ภายใต้ฝาครอบ
สิ่งนี้ได้ผลเพราะคุณใช้พลังสองอย่างในการแจงนับ ภายใต้หน้าปกค่าการแจงนับของคุณจะมีลักษณะเช่นนี้ในไบนารีและศูนย์:
Yellow: 00000001
Green: 00000010
Red: 00000100
Blue: 00001000
ในทำนองเดียวกันหลังจากที่คุณตั้งค่าคุณสมบัติAllowedColorsของคุณเป็นสีแดงสีเขียวและสีน้ำเงินโดยใช้ตัวดำเนินการ binary bitwise หรือ|
ตัวดำเนินการAllowedColorsจะมีลักษณะดังนี้:
myProperties.AllowedColors: 00001110
ดังนั้นเมื่อคุณดึงค่าที่คุณกำลังดำเนินการจริง bitwise และ&
ค่า:
myProperties.AllowedColors: 00001110
MyColor.Green: 00000010
-----------------------
00000010 // Hey, this is the same as MyColor.Green!
ค่า None = 0
และเกี่ยวกับการใช้0
ในการแจงนับข้อความจาก MSDN:
[Flags]
public enum MyColors
{
None = 0,
....
}
ใช้ None เป็นชื่อของค่าคงที่ที่ระบุค่าสถานะซึ่งเป็นศูนย์ คุณไม่สามารถใช้ค่าคงที่ไม่มีการแจกแจงในการดำเนินการระดับบิตและระดับบิตเพื่อทดสอบการตั้งค่าสถานะเนื่องจากผลลัพธ์จะเป็นศูนย์เสมอ อย่างไรก็ตามคุณสามารถดำเนินการทางตรรกะไม่ใช่ค่าบิตเปรียบเทียบระหว่างค่าตัวเลขและค่าคงที่ไม่มีการแจกแจงเพื่อกำหนดว่าบิตใด ๆ ในค่าตัวเลขถูกตั้งค่า
คุณสามารถค้นหาข้อมูลเพิ่มเติมเกี่ยวกับแอ็ตทริบิวต์ค่าสถานะและการใช้งานได้ที่msdnและการออกแบบค่าสถานะที่ msdn