You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Visual Studio 2017 C# RichTextBox完整字体比较失败原因咨询

关于RichTextBox中Font对象直接比较失败的原因解析

嘿,这个问题我太熟了,我来给你掰扯清楚为啥会这样:

先看你提到的两种代码示例

失败的代码(直接比较Font对象)

if (richTextBox1.SelectionFont == new Font("Arial", 12, FontStyle.Bold))
{
    // 永远不会进入这个分支
}

正常运行的代码(比较Font的具体属性)

if (richTextBox1.SelectionFont.Name == "Arial" &&
    richTextBox1.SelectionFont.Size == 12 &&
    richTextBox1.SelectionFont.Style == FontStyle.Bold)
{
    // 能正确执行预期逻辑
}

核心原因其实是「引用类型 vs 值类型」的比较逻辑差异

在C#里,Font是引用类型,默认情况下用==运算符比较的是两个对象的内存引用地址,而不是它们的属性内容。哪怕你new出来的Font和RichTextBox选中区域的Font在名称、大小、样式上完全一模一样,它们也是两个独立的对象实例,内存地址不一样,所以==会返回false,导致你的判断失败。

而你成功的代码是直接对比Font的具体属性:

  • Name是字符串类型,C#里字符串的==默认是比较内容而非引用;
  • Size是浮点数(值类型),比较的是实际数值;
  • Style是枚举类型(值类型),比较的是枚举对应的数值。

这些都是在比较「实际的属性内容」,自然能正确判断字体是否一致。

额外小提示

如果你想简化代码,也可以尝试用Font.Equals()方法(因为Font类重写了Equals方法,会对比属性内容),不过要注意一些容易忽略的细节,比如字体的Unit属性(比如是Point还是Pixel),如果这些隐性属性不一致,Equals也会返回false。所以最稳妥的方式还是像你成功的代码那样,明确对比你关心的字体属性。

内容的提问来源于stack exchange,提问作者MERLIN

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 07:24:49