昨天我发现一个有趣的问题。最近我进行 OPCUA 组件的压测时,我注意到写入并校验的过程中,总是不断打出错误日志。明明写入操作已经成功,为什么会一直重复写并且出现写失败的情况呢?
经过排查,我发现问题的根源在于数据传递的方式。为了方便传递数据,我采用了 object 类型来传递值。正是因为使用了 object 类型传递数据,才导致了这个问题的出现。
在比较 object 类型时,即使两个值相同,比较操作也会失败。最终我采取了一种折中的方法:将修改的值和当前值都转换成字符串类型再进行比较。这样就能解决问题,避免了值相等但却由于类型不匹配而导致的比较失败。
是不是很意外,值相同却被认为不相等呢?更有意思的是,即便 object 中的字符串内容完全相同,比较结果却是 false。
以上这种字符串相同的情况,我简单写了一个demo大概复现了我遇到的情况,现在我分享给大家可以减少一些弯路。
https://github.com/peijiehuang/ObjectComparer
第一、为什么值相同,但值类型分别是 int16
和 int32
时不相等?
这是因为数据被装箱为 object
类型后,比较操作变成了引用比较。
尽管两个值相等,但装箱后的引用地址不同,==
比较的是引用地址,而不是值,因此结果是 False
。
第二、为什么字符串相同,却会不相等?
这是由于字符串可能是动态生成的,而非静态驻留。
动态生成的字符串并不会自动指向相同的内存地址,即便它们的值完全一致。
因此,字符串的引用不同,导致比较结果为 False
,尽管字符串的内容是一样的。