在引用类型上调用ToString()

时间:2012-11-07 16:59:03

标签: c# nhibernate object reference-type

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

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

未处理

集合[ * ]

1 个答案:

答案 0 :(得分:0)

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

对于这种情况,必须遵循以下规则:

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

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