我正在使用一些旧代码,尝试改进它,我遇到了以下内容,我无法理解:
controlToUpdate.Font =
new System.Drawing.Font(someFont,
someFontSize,
controlToUpdate.Font.Style ^
(controlToUpdate.Font.Style & FontStyle.Bold));
具体来说,我对最后一个参数的作用感到困惑。据我了解,以下内容应进行逐位比较,并返回结果:
controlToUpdate.Font.Style ^ (controlToUpdate.Font.Style & FontStyle.Bold)
..但这在这种情况下意味着什么?可能的结果是什么,可以作为第三个参数传递给new Font(...)
,我怎样才能更清楚地重写它,同时保持原始程序员的意图?
旁注:在使用Windows窗体时,这是否是正常的做法?我在这个领域有点新鲜 - 对于在这个领域更有经验的编码人员来说,这里的意图是否明显?
答案 0 :(得分:3)
controlToUpdate.Font.Style & FontStyle.Bold
执行"和"如果样式(FontStyle.Bold
)包含粗体,则返回controlToUpdate.Font.Style
;如果样式不包含粗体,则返回0
:基本上,它只获得"粗体"位。
controlToUpdate.Font.Style ^ (controlToUpdate.Font.Style & FontStyle.Bold)
执行" xor&#34 ;;如果设置了粗体位,则将其删除;如果粗体位不设置,那么它什么都不做(因为" xor" 0是无操作)。
所以基本上,复杂的代码只是删除了"粗体"位(如果已设置)。一个更简单的实现应该是:
controlToUpdate.Font.Style & ~FontStyle.Bold
如何工作:在这里,~FontStyle.Bold
反转所有位; FontStyle.Bold
是1
:
000....000001
所以~FontStyle.Bold
是:
111...1111110
然后我们"和"使用我们当前的样式,这意味着它将所有旧样式 除了 保留为粗体。
答案 1 :(得分:2)
FontStyle
枚举是Flags
枚举,使其成为bitmaps。
使用按位运算符,可以找出“打开”,“关闭”的标志,当然还可以更改它们。
这很常见 - 例如,要查明样式是粗体还是斜体,您可以使用:
FontStyle.Bold | FontStyle.Italic
答案 2 :(得分: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)
粗体时,controlToUpdate.Font.Style
才会返回true
之后
controlToUpdate.Font.Style ^
:按位XOR
运算符,其中相同的值为0
1 1 = 0
0 0 = 0
1 0 = 1
0 1 = 1
因此,考虑到之前的输出(比如 Bold ),结果将为false
或0
,因此常规字体样式。
在实践中,这是一种隐藏 Regular 类型字体的方法,与控件上设置的真实样式无关。