1

私はいくつかの古いコードで作業しており、それを改善しようとしていますが、理解に苦労している以下に出くわしました:

controlToUpdate.Font = 
    new System.Drawing.Font(someFont,
                            someFontSize,
                            controlToUpdate.Font.Style ^ 
                                (controlToUpdate.Font.Style & FontStyle.Bold));

具体的には、最後のパラメーターが何をするかについて混乱しています。私が理解しているように、以下はビットごとの比較を行い、結果を返す必要があります。

controlToUpdate.Font.Style ^ (controlToUpdate.Font.Style & FontStyle.Bold)

..しかし、この状況でそれはどういう意味ですか?の 3 番目のパラメーターとして渡される可能性のある結果は何new Font(...)ですか?元のプログラマーの意図を維持しながら、これをより明確に書き直すにはどうすればよいですか?

補足: Windows フォームで作業する場合、これは通常の方法ですか? 私はその分野では少し新しいです - ここでの意図は、この分野でより経験豊富なコーダーには明らかですか?

4

3 に答える 3

3
controlToUpdate.Font.Style & FontStyle.Bold

FontStyle.Boldスタイル ( controlToUpdate.Font.Style) に太字が含まれている場合は「and」を実行し、スタイルに太字が含まれ0ていない場合は、基本的に「太字」ビットのみを取得します。

controlToUpdate.Font.Style ^ (controlToUpdate.Font.Style & FontStyle.Bold)

「xor」を実行します。太字ビットが設定されていた場合は、それを削除します。太字のビットが設定されていない場合は、何もしません (0 の "xor" はノーオペレーションであるため)。

したがって、基本的に、その複雑なコードは「太字」ビットを削除するだけです (設定されている場合)。より単純な実装は次のようになります。

controlToUpdate.Font.Style & ~FontStyle.Bold

仕組み: ここでは、すべてのビットを~FontStyle.Bold 反転します。FontStyle.Bold1:

000....000001

そう~FontStyle.Boldです:

111...1111110

次に、それを現在のスタイルで "and" します。つまり、太字以外のすべての古いスタイルが保持されます。

于 2013-01-16T09:47:25.763 に答える
2

これが正常であるかどうかは、これを行う理由によって異なりますが、基本的には次のことを意味します。

controlToUpdate.Font.Style ^ (controlToUpdate.Font.Style & FontStyle.Bold)

(controlToUpdate.Font.Style & FontStyle.Bold):ビット単位ANDなので、を持っていれば十分であり0、戻り0ます(これは乗算のように考えることができます)

1 0 = 0
0 1 = 0 
1 1 = 1 
0 0 = 0

したがって、太字の場合に(controlToUpdate.Font.Style & FontStyle.Bold)のみtrueが返されますcontrolToUpdate.Font.Style

私たちが持った後

controlToUpdate.Font.Style ^:ビットXOR演算子。同じ値で次のようになります。0

1 1  = 0 
0 0  = 0
1 0  = 1 
0 1 =  1

したがって、以前の出力(太字など)を考慮すると、結果はfalseまたは0、つまり通常のフォントスタイルになります。

実際には、これは、コントロールに設定されている実際のスタイルとは関係なく、レギュラータイプのフォントを適用する方法です。

于 2013-01-16T09:44:04.553 に答える
2

FontStyle列挙は列挙Flagsであり、それらをビットマップにします。

ビット単位の演算子を使用すると、どのフラグが「オン」、「オフ」であるかを確認し、もちろんそれらを変更できます。

これは非常に一般的です。たとえば、スタイルがボールドかイタリックかを調べるには、次のようにします。

FontStyle.Bold | FontStyle.Italic
于 2013-01-16T09:41:36.477 に答える