0

そのオブジェクトへの参照を与えずに、参照型に値を割り当てることはできますか? 私はファイル情報を取得する関数を持っているように、それが後で別のスレッドで変更されたかどうかを確認したい.

info = GetInfo(path);
checkInfo=info; // I make changes to info later, but I wanna checkInfo to remain the same
4

3 に答える 3

0

info 変数を複製するか、再割り当てする必要があります。クローンを作成するのは手作業でかなりの作業になり、壊れやすい可能性が高いため、次のような方法をお勧めします。

checkInfo = info:
info = GetInfo(path);

もう 1 つのオプションは、ここに来る前に info 変数を変更しなかった場合、GetInfo を使用して checkInfo を設定することです。その場合、GetInfo は両方に対して同じオブジェクトを構築するため、同じ結果が得られるという事実を考慮してください。

于 2013-03-28T10:14:46.770 に答える
0

あなたの質問を理解する限り、情報オブジェクトのディープコピーを作成する必要があります

これが解決策です(シリアル化を使用)

次のような拡張メソッドを作成します。

public static class ExtensionMethods
{
    // Deep clone
    public static T DeepClone<T>(this T a)
    {
        using (MemoryStream stream = new MemoryStream())
        {
            BinaryFormatter formatter = new BinaryFormatter();
            formatter.Serialize(stream, a);
            stream.Position = 0;
            return (T) formatter.Deserialize(stream);
        }
    }
}

これを使って:

checkInfo = info.DeepClone();

PS 通常、ディープ クローニングの必要性は、コード リファクタリングの必要性を意味します。必ずしもそうではありませんが、かなり頻繁に..オブジェクトをコピーするよりも、あなたの場合にはより良い解決策があるはずです。

于 2013-03-28T10:15:10.020 に答える
0

FileInfo クラスを別のクラスで非表示/ラップし、他のスレッドがラッパー クラスのみにアクセスできるようにすることができます。ラッパー クラスは、他のスレッドが FileInfo を変更したときに、FileInfoChanged などのイベントを発生させることができます。

于 2013-03-28T10:28:43.057 に答える