减少比特位序逻辑

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

然而,这种方法行不通,因为编译器似乎不喜欢我直接将和符号应用于布尔值和标志/枚举类型。


5
第一个片段清晰易懂,我不会做出改变。 - Lukasz Madon
3个回答

2
如何按照以下方式处理:

如何按照以下方式处理:

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

这种方法比之前的尝试更有效吗?我认为它更简洁,符合OP的要求,但我想知道它是否更快。我只是问一下,因为我们正在处理位操作。 - BlackVegetable
1
赋值操作符(=)应该改为按位或赋值操作符(|=),以匹配原始行为。 - HABO
@BlackVegetable 我认为OP只关心简洁性。尽管如此,我个人认为它不比原始代码更易读。 - Dmytro Shevchenko
@Shedal,我不明白你的意思。听起来你说的和我刚才说的一样:在你原来的答案中,必须先将枚举设置为0,因为给定的代码只是“添加”标志,而不是“设置”它们。 - Martin Bliss
@Shedal 我不知道为什么我之前没想到这个!我很确定我曾经尝试过,但是它现在可以工作了,所以我想我之前肯定犯了一个错误。谢谢! - Martin Bliss
显示剩余5条评论

0

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

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

同样缩进表达式的相似部分是我个人的风格,你并不一定要在自己的代码中采用。


与Shedal的答案类似,这并不能确保在所有框都被选中时设置了FontStyle.Regular位(如果有)。它应该使用|=或者放弃FontStyle.Regular | - HABO
我修复了它,使其始终设置为FontStyle.Regular。 - Wug

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

这并不一定更加简洁,但它可以避免重复。


你也可以将它定义为 Dictionary<bool, FontStyle> - Dmytro Shevchenko
确实,任何可以容纳所有数据的东西都可以。我只是喜欢匿名类的名称。 - Paul Phillips

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接