4

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

(FontStyle 是一个带有 Flags 属性的 .NET 枚举)

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 和所需标志之间正确应用 and & 运算符,类似于以下内容:

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

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

4

3 回答 3

2

沿着这些思路怎么样:

lblPrompt.Font.Style |=
    (chkBold.Checked ? FontStyle.Bold : 0)
    | (chkItalics.Checked ? FontStyle.Italic : 0)
    | (chkUnderline.Checked ?  FontStyle.Underline : 0);
于 2012-07-26T20:31:39.080 回答
0

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

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

类似地缩进表达式的相似部分是我所做的一种风格化的事情,你没有义务将它带到你自己的代码中。

于 2012-07-26T20:35:02.370 回答
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;        
}

这不一定更简洁,但它可以防止你重复自己。

于 2012-07-26T20:47:33.670 回答