The [Flags]
atribut harus digunakan setiap kali enumerable merupakan kumpulan nilai yang mungkin, bukan nilai tunggal. Koleksi semacam itu sering digunakan dengan operator bitwise, misalnya:
var allowedColors = MyColor.Red | MyColor.Green | MyColor.Blue;
Perhatikan bahwa [Flags]
atribut tidak mengaktifkan ini dengan sendirinya - semua yang dilakukannya adalah memperbolehkan representasi yang bagus dengan .ToString()
metode:
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"
Penting juga untuk dicatat bahwa [Flags]
tidak secara otomatis membuat enum nilai kekuatan dua. Jika Anda menghilangkan nilai numerik, enum tidak akan berfungsi seperti yang diharapkan dalam operasi bitwise, karena secara default nilai dimulai dengan 0 dan kenaikan.
Deklarasi salah:
[Flags]
public enum MyColors
{
Yellow, // 0
Green, // 1
Red, // 2
Blue // 3
}
Nilai-nilai, jika dinyatakan dengan cara ini, akan menjadi Kuning = 0, Hijau = 1, Merah = 2, Biru = 3. Ini akan menjadikannya tidak berguna sebagai bendera.
Berikut ini contoh deklarasi yang benar:
[Flags]
public enum MyColors
{
Yellow = 1,
Green = 2,
Red = 4,
Blue = 8
}
Untuk mengambil nilai berbeda di properti Anda, orang dapat melakukan ini:
if (myProperties.AllowedColors.HasFlag(MyColor.Yellow))
{
// Yellow is allowed...
}
atau sebelum .NET 4:
if((myProperties.AllowedColors & MyColor.Yellow) == MyColor.Yellow)
{
// Yellow is allowed...
}
if((myProperties.AllowedColors & MyColor.Green) == MyColor.Green)
{
// Green is allowed...
}
Di bawah selimut
Ini berfungsi karena Anda menggunakan kekuatan dua dalam enumerasi Anda. Di bawah sampul, nilai enumerasi Anda terlihat seperti ini dalam nilai biner dan nol:
Yellow: 00000001
Green: 00000010
Red: 00000100
Blue: 00001000
Demikian pula, setelah Anda mengatur properti Anda AllowColors ke Merah, Hijau dan Biru menggunakan bitwise biner ATAU |
operator, DiizinkanColors terlihat seperti ini:
myProperties.AllowedColors: 00001110
Jadi ketika Anda mengambil nilai Anda sebenarnya melakukan bitwise DAN &
pada nilai-nilai:
myProperties.AllowedColors: 00001110
MyColor.Green: 00000010
-----------------------
00000010 // Hey, this is the same as MyColor.Green!
Nilai None = 0
Dan mengenai penggunaan 0
dalam enumerasi Anda, mengutip dari MSDN:
[Flags]
public enum MyColors
{
None = 0,
....
}
Gunakan Tidak Ada sebagai nama bendera yang disebutkan konstanta yang nilainya nol. Anda tidak dapat menggunakan konstanta None yang disebutkan dalam operasi AND AND bitwise untuk menguji bendera karena hasilnya selalu nol. Namun, Anda dapat melakukan perbandingan logis, bukan bitwise, antara nilai numerik dan konstanta None yang disebutkan untuk menentukan apakah ada bit dalam nilai numerik yang ditetapkan.
Anda dapat menemukan lebih banyak info tentang atribut flags dan penggunaannya di msdn dan mendesain flags di msdn