[Flags]
Numaralandırılabilir yerine tek bir değerden, olası değerler koleksiyonunu temsil her özellik kullanılmalıdır. Bu tür koleksiyonlar genellikle bitsel operatörlerle kullanılır, örneğin:
var allowedColors = MyColor.Red | MyColor.Green | MyColor.Blue;
[Flags]
Özniteliğin bunu tek başına etkinleştirmediğini unutmayın - tek yaptığı .ToString()
yöntemle güzel bir temsile izin vermektir :
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"
Ayrıca, enum değerlerinin otomatik olarak ikisinin gücünü [Flags]
yapmadığını da belirtmek önemlidir . Sayısal değerleri atlarsanız, enum bitsel işlemlerde beklendiği gibi çalışmaz, çünkü varsayılan olarak değerler 0 ve artışla başlar.
Yanlış beyan:
[Flags]
public enum MyColors
{
Yellow, // 0
Green, // 1
Red, // 2
Blue // 3
}
Bu şekilde bildirilen değerler Sarı = 0, Yeşil = 1, Kırmızı = 2, Mavi = 3 olacaktır. Bu, bayrak olarak işe yaramaz hale gelir.
İşte doğru bir beyan örneği:
[Flags]
public enum MyColors
{
Yellow = 1,
Green = 2,
Red = 4,
Blue = 8
}
Mülkünüzdeki farklı değerleri almak için bunu yapabilirsiniz:
if (myProperties.AllowedColors.HasFlag(MyColor.Yellow))
{
// Yellow is allowed...
}
veya .NET 4'ten önce:
if((myProperties.AllowedColors & MyColor.Yellow) == MyColor.Yellow)
{
// Yellow is allowed...
}
if((myProperties.AllowedColors & MyColor.Green) == MyColor.Green)
{
// Green is allowed...
}
Kapakların altında
Bu işe yarıyor çünkü numaralandırmanızda iki güç kullandınız. Kapakların altında, numaralandırma değerleriniz ikili ve sıfırlarda şöyle görünür:
Yellow: 00000001
Green: 00000010
Red: 00000100
Blue: 00001000
Benzer şekilde, ikili bitwise OR operatörünü kullanarak AllowColors mülkünüzü Kırmızı, Yeşil ve Mavi olarak ayarladıktan sonra |
, AllowColors şöyle görünür:
myProperties.AllowedColors: 00001110
Bu nedenle, değeri aldığınızda, gerçekte bitsel ve performans &
değerleri üzerinde çalışıyorsunuz:
myProperties.AllowedColors: 00001110
MyColor.Green: 00000010
-----------------------
00000010 // Hey, this is the same as MyColor.Green!
Yok = 0 değeri
0
Numaralandırmanızda kullanımla ilgili olarak, MSDN'den alıntı yaparak:
[Flags]
public enum MyColors
{
None = 0,
....
}
Değeri sıfır olan bayrak numaralandırma sabiti adı olarak Yok'u kullanın. Sonuç her zaman sıfır olduğu için bir bayrağı test etmek için Yok numaralandırılmış sabiti bit yönünde VE işleminde kullanamazsınız. Bununla birlikte, sayısal değerdeki herhangi bir bitin ayarlanıp ayarlanmadığını belirlemek için, sayısal değer ile Hiçbiri numaralandırılmamış sabiti arasında bitsel olarak değil mantıksal bir karşılaştırma yapabilirsiniz.
Daha bayraklar özelliği hakkında bilgi ve onun kullanımını bulabilirsiniz msdn ve msdn de tasarlama bayrakları