Bit tartibi mantiqini qisqartirish

Menda quyidagi kod bor va men ushbu kodni yozishning qisqaroq, qisqartirilgan usuli bormi, deb o'ylayman:

(FontStyle - Flags atributiga ega .NET Enum)

lblPrompt.Font.Style = FontStyle.Regular;

if (chkBold.Checked)
    lblPrompt.Font.Style |= FontStyle.Bold;
if (chkItalics.Checked)
    lblPrompt.Font.Style |= FontStyle.Italic;
if (chkUnderline.Checked)
    lblPrompt.Font.Style |= FontStyle.Underline;

Menimcha, javob CheckBox.Checked va kerakli bayroq o'rtasida quyidagiga o'xshash va & operatorini to'g'ri qo'llashda bo'ladi:

lblPrompt.Font.Style =
    (chkBold.Checked & FontStyle.Bold)
    | (chkItalics.Checked & FontStyle.Italic)
    | (chkUnderline.Checked & FontStyle.Underline);

Biroq, bu ishlamaydi, chunki kompilyator mening ampersandni bool va Flag/Enum turi bilan to'g'ridan-to'g'ri qo'llashimni yoqtirmaydi.


person Martin Bliss    schedule 26.07.2012    source manba
comment
Birinchi parcha aniq va mulohaza yuritish oson. Men uni o'zgartirmagan bo'lardim.   -  person Lukasz Madon    schedule 27.07.2012


Javoblar (3)


Bu qatordagi biror narsa haqida nima deyish mumkin:

lblPrompt.Font.Style |=
    (chkBold.Checked ? FontStyle.Bold : 0)
    | (chkItalics.Checked ? FontStyle.Italic : 0)
    | (chkUnderline.Checked ?  FontStyle.Underline : 0);
person Dmytro Shevchenko    schedule 26.07.2012
comment
Bu avvalgi urinishdan ko'ra samaraliroqmi? Bu qisqaroq, menimcha, OP nima bo'lgan edi, lekin men tezroqmi deb o'ylayman. Men faqat so'rayman, chunki biz bitli manipulyatsiya bilan shug'ullanamiz. - person BlackVegetable; 27.07.2012
comment
Topshiriq (=) asl xatti-harakatga mos keladigan OR (|=) bo'lishi kerak. - person HABO; 27.07.2012
comment
@BlackVegetable Menimcha, OP faqat qisqalik haqida qayg'urgan. Biroq, shaxsan men uni asl koddan ko'ra o'qish mumkin deb o'ylamayman. - person Dmytro Shevchenko; 27.07.2012
comment
Bu yechim ishlaydi, garchi siz undan oldin quyidagini kiritishingiz kerak bo'lsa: ( lblPrompt.Font.Style = FontStyle.Regular ) aks holda u shunchaki yangi bayroqlar qo'shadi, ularni UI boshqaruvlari holatiga qaytarmaydi. Men haqiqatan ham qisqalik uchun o'zgaruvchini nolga oldindan o'rnatmasdan bayroqlarni o'rnatishga imkon beradigan yechimga umid qilgandim. - person Martin Bliss; 27.07.2012
comment
@MartinBliss yaxshi, siz enumingizda FontStyle.Regular = 0 belgilashingiz mumkin. Keyin u bit mantiqini bajarishda standart qiymatdir. - person Dmytro Shevchenko; 27.07.2012
comment
@Shedal Men nimani nazarda tutayotganingizni tushunmayapman. Siz xuddi men aytgan narsani aytayotganga o'xshaysiz: asl javobingizdagi koddan OLD 0 ga raqamni o'rnatishingiz kerak, chunki berilgan kod faqat bayroqlarni qo'shadi va ularni o'rnatmaydi. - person Martin Bliss; 27.07.2012
comment
@Martin enumni belgilashda bayroqlar uchun raqamli qiymatlarni qo'lda belgilash imkoniyatini nazarda tutgan edim. Kabi, Regular=0, Bold=1 va hokazo. Bunday holda, hech qanday bayroq allaqachon Muntazam degani emas. Lekin, ehtimol, men yechimda nima etishmayotganingizni noto'g'ri tushundim. - person Dmytro Shevchenko; 27.07.2012
comment
@Shedal Men shuni aytmoqchimanki, men o'zgartira olmaydigan raqamni hisobga olsam (bu mening enum emas), kod qatoringizni bajarishdan oldin enum o'zgaruvchisining qiymatini 0 ga o'rnatishim kerak, aks holda men avvalgi qiymatni olaman. VA har qanday yangi bayroqlar o'rnatiladi. Misol uchun: Agar lblprompt.Font.Style ning boshlang'ich qiymati FontStyle.Italic bo'lsa va men Qalin va Pastga chizilgan belgilarni belgilagan bo'lsam, natija (kodingiz bilan) uchtasi ham bo'ladi. Agar kodingizdan oldin nolga qo'ysam, men kutilgan xatti-harakatni kursiv EMAS, qalin va tagiga chizilgan holda olaman. Men kod uslubi masalasi sifatida dastlabki bayroqni o'rnatishdan qochishga umid qilgandim. - person Martin Bliss; 28.07.2012
comment
@MartinBliss lblPrompt.Font.Style |= o'rniga lblPrompt.Font.Style = dan foydalaning. - person Dmytro Shevchenko; 28.07.2012
comment
@Shedal Men nima uchun bu haqda o'ylamaganimni bilmayman! Ishonchim komilki, men buni bir marta sinab ko'rganman va u ishlamagan, lekin u hozir ishlaydi, shuning uchun men oldin xato qilganman. Rahmat! - person Martin Bliss; 28.07.2012

Agar sizda ushbu uchta variantdan ko'ra ko'proq imkoniyatlar mavjud bo'lsa, jadvalga asoslangan yechimni bajarishga arziydi:

var table = new [] {
        new { box = chkBold, style = FontStyle.Bold },
        new { box = chkItalics, style = FontStyle.Italic },
        new { box = chkUnderline, style = FontStyle.Underline }
    };

foreach(var combo in table)
{
  if(combo.box.Checked) 
        lblPrompt.Font.Style |= combo.style;        
}

Bu qisqa boʻlishi shart emas, lekin bu sizni takrorlashdan saqlaydi.

person Paul Phillips    schedule 26.07.2012
comment
Siz uni Dictionary<bool, FontStyle> ham qilishingiz mumkin. - person Dmytro Shevchenko; 27.07.2012
comment
Darhaqiqat, barcha ma'lumotlarni saqlay oladigan har qanday narsa ishlaydi. Menga faqat anonim sinflarning nomlari yoqadi. - person Paul Phillips; 27.07.2012

Men o'ylashim mumkin bo'lgan yagona usul quyidagi kabi uchlik operatoridan foydalanishdir:

lblPrompt.Font.Style = FontStyle.Regular
             | (chkBold.Checked      ? FontStyle.Bold      : FontStyle.Regular)
             | (chkItalics.Checked   ? FontStyle.Italic    : FontStyle.Regular)
             | (chkUnderline.Checked ? FontStyle.Underline : FontStyle.Regular);

iboralarning o'xshash qismlarini xuddi shunday qilib qo'yish men qiladigan uslubiy ish va siz uni o'z kodingizga olib kirishga majbur emassiz.

person Wug    schedule 26.07.2012
comment
Shedalning javobiga o'xshab, bu barcha katakchalar belgilab qo'yilganda, agar mavjud bo'lsa, FontStyle.Regular bit o'rnatilishini ta'minlamaydi. U |= dan foydalanishi yoki FontStyle.Regular | kiritilishi kerak. - person HABO; 27.07.2012
comment
Men uni har doim FontStyle.Regular o'rnatish uchun tuzatdim. - person Wug; 27.07.2012