我有以下代码,我想知道是否有更简洁,更简洁的方式来编写此代码:
(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类型直接应用&符号。
答案 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;
}
这不一定是简洁,但它可以让你不再重复自己。