0

给定两个对象数组,我需要比较两者之间的差异(当转换为字符串时)。我已将代码简化为以下内容,但问题仍然存在:

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() 处理

4

1 回答 1

0

听起来在引用类型的 ToString() 方法中很可能会产生副作用,这通常是不好的做法,因为这是 .NET 框架经常使用的方法。

要做到这一点,必须满足以下条件:

  • 您正在使用您自己或其他第 3 方构建的自定义类。
  • 调用 ToString() 时会发生对象的一些修改。

要验证这一点,您可以创建引用类型的实例并在其上调用 ToString()。查看对象是否已更改(GetHashCode() 可能是确定这一点的一种方法)。或者你可以检查代码...

于 2012-11-07T17:04:16.097 回答