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

これら 3 つよりもはるかに多くのオプションがある場合は、テーブル駆動型のソリューションを実行する価値があるかもしれません。

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 に答える