การดำเนินการ enum ค่าสถานะของ. NET นั้นค่อนข้าง จำกัด เวลาส่วนใหญ่ที่ผู้ใช้เหลืออยู่ด้วยการหาตรรกะการดำเนินการระดับบิต
ใน. NET 4 วิธีการที่HasFlag
เพิ่มเข้ามาEnum
ซึ่งช่วยให้รหัสของผู้ใช้ง่ายขึ้น แต่น่าเสียดายที่มีปัญหามากมายกับมัน
HasFlag
ไม่ปลอดภัยสำหรับประเภทเพราะยอมรับข้อโต้แย้งค่า enum ทุกประเภทไม่ใช่เฉพาะประเภท enum ที่กำหนด
HasFlag
คลุมเครือว่าจะตรวจสอบหรือไม่ว่าค่านั้นมีค่าสถานะทั้งหมดหรือใด ๆ ที่ระบุโดยอาร์กิวเมนต์ค่า enum มันคือทั้งหมดที่โดยวิธีการ
HasFlag
ค่อนข้างช้าเนื่องจากต้องใช้มวยซึ่งเป็นสาเหตุของการจัดสรรและทำให้มีการรวบรวมขยะมากขึ้น
เนื่องจากส่วนหนึ่งของ. NET ที่สนับสนุนอย่าง จำกัด สำหรับการกำหนดค่าสถานะฉันเขียนไลบรารี OSS Enums.NETซึ่งจัดการปัญหาเหล่านี้แต่ละรายการและทำให้การจัดการกับค่าสถานะ enums ง่ายขึ้นมาก
ด้านล่างนี้คือการดำเนินการบางอย่างที่มีให้พร้อมกับการใช้งานที่เทียบเท่าโดยใช้เพียงกรอบงาน. NET
รวมธง
.สุทธิ flags | otherFlags
Enums.NET flags.CombineFlags(otherFlags)
ลบค่าสถานะ
.สุทธิ flags & ~otherFlags
Enums.NET flags.RemoveFlags(otherFlags)
ธงทั่วไป
.สุทธิ flags & otherFlags
Enums.NET flags.CommonFlags(otherFlags)
สลับค่าสถานะ
.สุทธิ flags ^ otherFlags
Enums.NET flags.ToggleFlags(otherFlags)
มีธงทั้งหมด
. NET (flags & otherFlags) == otherFlags
หรือflags.HasFlag(otherFlags)
Enums.NET flags.HasAllFlags(otherFlags)
มีธง
.สุทธิ (flags & otherFlags) != 0
Enums.NET flags.HasAnyFlags(otherFlags)
รับค่าสถานะ
.สุทธิ
Enumerable.Range(0, 64)
.Where(bit => ((flags.GetTypeCode() == TypeCode.UInt64 ? (long)(ulong)flags : Convert.ToInt64(flags)) & (1L << bit)) != 0)
.Select(bit => Enum.ToObject(flags.GetType(), 1L << bit))`
Enums.NET flags.GetFlags()
ฉันพยายามรับการปรับปรุงเหล่านี้รวมอยู่ใน. NET Core และอาจเป็น. NET Framework แบบเต็ม คุณสามารถตรวจสอบข้อเสนอของฉันที่นี่