减少位顺序逻辑

时间:2012-07-26 20:26:54

标签: c# logic bit flags

我有以下代码,我想知道是否有更简洁,更简洁的方式来编写此代码:

(FontStyle是带有Flags属性的.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;

我有一种感觉,答案在于正确应用和& CheckBox.Checked和所需标志之间的运算符,类似于以下内容:

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

但这不起作用,因为编译器显然不喜欢我使用bool和Flag / Enum类型直接应用&符号。

3 个答案:

答案 0 :(得分:2)

这些方面的内容如何:

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

答案 1 :(得分:0)

我能想到的唯一方法就是使用三元运算符,如下所示:

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

同样地,缩进表达式的相似部分是我所做的一种风格,并且你没有义务将它带入你自己的代码中。

答案 2 :(得分:0)

如果你有比这三个选项多得多的选项,那么可能值得做一个由表驱动的解决方案:

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;        
}

这不一定是简洁,但它可以让你不再重复自己。