【发布时间】:2012-11-07 16:59:02
【问题描述】:
给定两个对象数组,我需要比较两者之间的差异(当转换为字符串时)。我已将代码简化为以下,但问题仍然存在:
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";
}
但这只是一个临时的 hack,因为我希望能够覆盖我的引用类型上的 ToString() 方法并比较它们。
如果有人能解释为什么会发生这种情况并提供潜在的解决方案,我将不胜感激。谢谢
编辑:
帮助进一步解释我的申请。这段代码取自 NHibernate 事件监听器。我认为问题在于 NHibernate 在类周围添加了自己的包装器来处理延迟加载。这是它抛出的错误:
集合 [*] 没有被 flush() 处理
【问题讨论】:
-
“以某种方式更新了参考”是什么意思?如果您可以提供一个简短但完整的程序来演示该问题,那将有很大帮助。 (你的代码也比它需要的更令人困惑 - 为什么调用
ToString()两次?如果你希望结果是一个空字符串,如果ToString()返回一个空字符串,你不需要做任何替换.. .) -
您能否更准确地解释一下“参考已更新”是什么意思?
-
您能解释一下“参考资料已更新”是什么意思吗?
-
如果
value.toString() != string.Empty失败了就返回空字符串,为什么还要测试它? -
你是什么意思参考已更新。顺便说一句,所有数组项都被视为引用,甚至是值类型,因为装箱
标签: c# object tostring reference-type