[Flags]
atributi sanab o'tiladigan qiymat bitta qiymatni emas, balki mumkin bo'lgan qiymatlar to'plamini ifodalaganda ishlatilishi kerak. Bunday to'plamlar ko'pincha bitli operatorlar bilan ishlatiladi, masalan:
var allowedColors = MyColor.Red | MyColor.Green | MyColor.Blue;
Shuni esda tutingki, [Flags]
atributi o'z-o'zidan buni yoqmaydi - u faqat .ToString()
usuli bilan chiroyli tasvirlashga imkon beradi:
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"
Shuni ham ta'kidlash kerakki, [Flags]
avtomatik ravishda enum qiymatlarini ikkining kuchiga aylantirmaydi. Agar siz raqamli qiymatlarni o'tkazib yuborsangiz, raqam bit bo'yicha operatsiyalarda kutilgandek ishlamaydi, chunki sukut bo'yicha qiymatlar 0 dan boshlanadi va o'sadi.
Noto'g'ri deklaratsiya:
[Flags]
public enum MyColors
{
Yellow, // 0
Green, // 1
Red, // 2
Blue // 3
}
Agar shunday e'lon qilingan bo'lsa, qiymatlar Sariq = 0, Yashil = 1, Qizil = 2, Moviy = 3 bo'ladi. Bu uni bayroqlar sifatida foydasiz qiladi.
Mana to'g'ri deklaratsiyaga misol:
[Flags]
public enum MyColors
{
Yellow = 1,
Green = 2,
Red = 4,
Blue = 8
}
Mulkingizdagi aniq qiymatlarni olish uchun buni qilish mumkin:
if (myProperties.AllowedColors.HasFlag(MyColor.Yellow))
{
// Yellow is allowed...
}
yoki .NET 4 dan oldin:
if((myProperties.AllowedColors & MyColor.Yellow) == MyColor.Yellow)
{
// Yellow is allowed...
}
if((myProperties.AllowedColors & MyColor.Green) == MyColor.Green)
{
// Green is allowed...
}
Yopqoq ostida
Bu ishlaydi, chunki siz ro'yxatda ikkita kuch ishlatgansiz. Qopqoq ostida sizning hisob qiymatlaringiz ikkilik va nollarda shunday ko'rinadi:
Yellow: 00000001
Green: 00000010
Red: 00000100
Blue: 00001000
Xuddi shunday, AllowedColors xususiyatini ikkilik bitli OR |
operatori yordamida Qizil, Yashil va Moviyga o‘rnatganingizdan so‘ng, AllowedColors quyidagicha ko‘rinadi:
myProperties.AllowedColors: 00001110
Shunday qilib, siz qiymatni olganingizda, aslida qiymatlar bo'yicha bit bo'yicha VA &
bajarasiz:
myProperties.AllowedColors: 00001110
MyColor.Green: 00000010
-----------------------
00000010 // Hey, this is the same as MyColor.Green!
Yo'q = 0 qiymati
MSDN dan iqtibos keltirgan holda, ro'yxatingizda 0
dan foydalanish bo'yicha:
[Flags]
public enum MyColors
{
None = 0,
....
}
Qiymati nolga teng bo'lgan bayroqning sanab o'tilgan doimiy nomi sifatida None dan foydalaning. Natija har doim nolga teng boʻlgani uchun bayroqni sinash uchun Bit boʻyicha AND operatsiyasida None sanab oʻtilgan konstantadan foydalana olmaysiz. Shu bilan birga, raqamli qiymat va qiymat oʻrtasida bit boʻyicha emas, balki mantiqiy taqqoslashni amalga oshirishingiz mumkin. Raqamli qiymatdagi har qanday bit o'rnatilgan yoki yo'qligini aniqlash uchun sanab o'tilmagan doimiy.
Bayroqlar atributi va undan foydalanish haqida batafsil ma'lumotni msdn va msdn da bayroqlarni loyihalash
person
andynil
schedule
12.08.2008
CatAndDog = Cat | Dog
(shartli o'rniga mantiqiy OR) degani, menimcha? - person DdW   schedule 12.09.2016