C# 对引用类型调用ToString()

C# 对引用类型调用ToString(),c#,object,tostring,reference-type,C#,Object,Tostring,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 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()方法,并对它们进行比较

如果有人能解释为什么会发生这种情况并提供一个潜在的解决方案,我将不胜感激。谢谢

编辑

帮助进一步解释我的申请。这段代码取自NHibernate事件侦听器。我认为问题在于NHibernate在类周围添加了自己的包装器来处理延迟加载。下面是它抛出的错误:

flush()未处理集合[*]


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

在这种情况下,必须满足以下条件:

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

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

您所说的“引用以某种方式更新”到底是什么意思?如果你能提供一个简短但完整的程序来演示这个问题,那将非常有帮助。(您的代码也比它需要的更令人困惑-为什么要调用
ToString()
两次?如果
ToString()
返回空字符串,您希望结果是空字符串,您不需要进行任何替换…)您能更准确地解释一下“引用已更新”是什么意思吗?您能解释一下您的意思吗“引用已更新”?为什么要测试
value.toString()!=string.Empty
如果失败后仍要返回空字符串,则表示引用已更新。顺便说一句,所有数组项都被视为引用,甚至是值类型,因为框名。这实际上是一个注释,而不是答案,因为它问的是一个澄清性问题。@Servy:这是给定电流的答案帖子中的nt信息…通常一个问题可以有很多答案,我会将澄清问题转换为验证这是否是错误的方式。如果问题中没有足够的信息给出高质量的答案,那么你根本不回答,你要么在评论中问问题,直到答案出来,要么投票以“结束”这不是一个真正的问题“如果你觉得没有人能用提供的信息回答。你不做的是将问题或低质量的答案作为答案进行事后澄清。你有你正在比较的这些对象的来源吗?如果是这样,您应该采取利用IEqualityComparer的方法。无论哪种方式,都有可能是您正在转换的类型之一已重写了ToString方法,并且正在过程中更改自身。最后,使用Convert.ToString(对象)将更有效地替换GetStringValue方法。最后,不清楚您的Compare方法返回的是什么,因为它的返回类型为void,您没有列出它的其余部分。谢谢,我将此标记为答案,因为它不仅帮助我认识到问题,而且我还使用您创建新实例的建议找到了一个很好的解决方案。再次感谢。
public string GetStringValue(object value) {
    return value != null && (value.GetType().IsValueType || value is string)
        && value.ToString() != string.Empty ? value.ToString() : "No Value";
}