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
相关产品推荐
相关产品推荐

