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)

..但是在这种情况下这意味着什么?可能的结果是什么,可以作为第三个参数传递给new Font(...),我怎样才能更清楚地重写它,同时保持原始程序员的意图?

旁注:在使用 Windows 窗体时,这是一种正常的做事方式吗?我在那个领域有点新 - 这里的意图对于在这个领域更有经验的编码人员来说是显而易见的吗?

4

3 回答 3

3
controlToUpdate.Font.Style & FontStyle.Bold

FontStyle.Bold如果样式 ( controlToUpdate.Font.Style) 包含粗体,并且0样式不包含粗体,则执行“与”返回:基本上,它只得到“粗体”位。

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

执行“异或”;如果设置了粗体位,则将其删除;如果未设置粗体位,则它什么也不做(因为“xor”与 0 是无操作的)。

所以基本上,那个复杂的代码只是删除了“粗体”位(如果已设置)。一个更简单的实现是:

controlToUpdate.Font.Style & ~FontStyle.Bold

它是如何工作的:在这里,~FontStyle.Bold 反转所有位;FontStyle.Bold1

000....000001

所以~FontStyle.Bold是:

111...1111110

然后我们用我们当前的样式“和”它,这意味着它保留了粗体位之外的所有旧样式。

于 2013-01-16T09:47:25.763 回答
2

FontStyle枚举就是枚举,把Flags它们做成位图

使用按位运算符,您可以找出哪些标志是“on”、“off”,当然,还可以更改它们。

这很常见 - 例如,要确定样式是粗体还是斜体,您可以使用:

FontStyle.Bold | FontStyle.Italic
于 2013-01-16T09:41:36.477 回答
2

这是否正常取决于这样做的原因,但基本上这意味着:

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

(controlToUpdate.Font.Style & FontStyle.Bold): 按位AND,所以有 a 就足够了0,它会返回0(可以把它想象成乘法)

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

所以会返回 true ,(controlToUpdate.Font.Style & FontStyle.Bold)只有当controlToUpdate.Font.Style也是Bold时

在我们拥有之后

controlToUpdate.Font.Style ^:位运算XOR符,其中相同的值给出0

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

所以,考虑到以前的输出(比如说它是一个Bold),结果将是falseor 0,所以Regular字体样式。

实际上,这是一种强制常规类型字体的方法,独立于控件上设置的实际样式。

于 2013-01-16T09:44:04.553 回答