Sayangnya, operasi flag enum bawaan NET. Cukup terbatas. Sebagian besar waktu pengguna dibiarkan mencari tahu logika operasi bitwise.
Dalam. NET 4, metode HasFlag
ini ditambahkan ke Enum
yang membantu menyederhanakan kode pengguna tetapi sayangnya ada banyak masalah dengannya.
HasFlag
bukan tipe-aman karena menerima semua jenis argumen nilai enum, bukan hanya tipe enum yang diberikan.
HasFlag
tidak jelas apakah memeriksa apakah nilai memiliki semua atau salah satu flag yang disediakan oleh argumen nilai enum. Semua itu omong-omong.
HasFlag
agak lambat karena membutuhkan tinju yang menyebabkan alokasi dan dengan demikian lebih banyak pengumpulan sampah.
Sebagian karena .NET dukungan terbatas untuk flag enums saya menulis perpustakaan OSS Enums.NET yang membahas masing-masing masalah ini dan membuat berurusan dengan flag enums lebih mudah.
Di bawah ini adalah beberapa operasi yang disediakan beserta implementasinya yang setara hanya dengan menggunakan .NET framework.
Gabungkan Bendera
.BERSIH flags | otherFlags
Enums.NET flags.CombineFlags(otherFlags)
Hapus Bendera
.BERSIH flags & ~otherFlags
Enums.NET flags.RemoveFlags(otherFlags)
Bendera umum
.BERSIH flags & otherFlags
Enums.NET flags.CommonFlags(otherFlags)
Toggle Flags
.BERSIH flags ^ otherFlags
Enums.NET flags.ToggleFlags(otherFlags)
Memiliki Semua Bendera
.NET (flags & otherFlags) == otherFlags
atauflags.HasFlag(otherFlags)
Enums.NET flags.HasAllFlags(otherFlags)
Memiliki Bendera Apa Pun
.BERSIH (flags & otherFlags) != 0
Enums.NET flags.HasAnyFlags(otherFlags)
Dapatkan Bendera
.BERSIH
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()
Saya mencoba untuk mendapatkan perbaikan ini dimasukkan ke dalam. NET Core dan mungkin akhirnya .NET Framework. Anda dapat memeriksa proposal saya di sini .