给定两个对象数组,我需要比较两者之间的差异(转换为字符串时)。我已将代码缩减为以下内容,问题仍然存在:
public void Compare(object[] array1, object[] array2) {
for (var i = 0; i < array1.Length; i++) {
var value1 = GetStringValue(array1[i]);
var value2 = GetStringValue(array2[i]);
}
}
public string GetStringValue(object value) {
return value != null && value.ToString() != string.Empty ?
value.ToString() : "No Value";
}
无论我抛出什么对象数组,代码都会执行得很好。但是,如果数组中的某个项是引用类型,则以某种方式更新引用。这会导致问题。
当针对对象引用调用ToString()时,似乎会发生这种情况。我已经将GetStringValue方法更新为以下内容(这确保了对象是值类型或字符串)并且问题消失了。
public string GetStringValue(object value) {
return value != null && (value.GetType().IsValueType || value is string)
&& value.ToString() != string.Empty ? value.ToString() : "No Value";
}
然而,这只是一个暂时的黑客,因为我希望能够覆盖我的引用类型上的ToString()方法并对它们进行比较。
如果有人能解释为什么会发生这种情况并提供潜在的解决方案,我将不胜感激。感谢
修改:
帮助进一步解释我的申请。这段代码取自NHibernate事件监听器。我认为问题在于NHibernate在类中添加了自己的包装来处理延迟加载。这是它抛出的错误:
flush()未处理集合[ * ]
答案 0 :(得分:0)
听起来在引用类型的ToString()方法中可能会产生副作用,这通常是不好的做法,因为这是.NET框架经常使用的方法。
对于这种情况,必须遵循以下规则:
要验证这一点,您只需创建引用类型的实例并在其上调用ToString()。查看对象是否已更改(GetHashCode()可能是确定此对象的一种方法)。或者您可以检查代码......