0

2 つのオブジェクト配列が与えられた場合、2 つの違いを比較する必要があります (文字列に変換された場合)。コードを次のように縮小しましたが、問題はまだ存在します。

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";
}

どのオブジェクト配列をスローしても、コードは正常に実行されます。ただし、配列内の項目の 1 つが参照型である場合は、参照が何らかの形で更新されます。これにより、後で問題が発生します。

これは、オブジェクト参照に対して 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() によって処理されませんでした

4

1 に答える 1

0

参照型のToString()メソッド内で副作用が発生している可能性があります。これは、.NET Frameworkでよく使用されるメソッドであるため、一般的にはお勧めできません。

これが当てはまるためには、次のことが当てはまる必要があります。

  • 自分自身または別のサードパーティが作成したカスタムクラスを使用しています。
  • ToString()を呼び出すと、オブジェクトの変更が発生します。

これを確認するには、参照型のインスタンスを作成し、そのインスタンスでToString()を呼び出すだけです。オブジェクトが変更されたかどうかを確認します(GetHashCode()がこれを判別する1つの方法である可能性があります)。または、コードを調べることができます...

于 2012-11-07T17:04:16.097 に答える