そのオブジェクトへの参照を与えずに、参照型に値を割り当てることはできますか? 私はファイル情報を取得する関数を持っているように、それが後で別のスレッドで変更されたかどうかを確認したい.
例
info = GetInfo(path);
checkInfo=info; // I make changes to info later, but I wanna checkInfo to remain the same
そのオブジェクトへの参照を与えずに、参照型に値を割り当てることはできますか? 私はファイル情報を取得する関数を持っているように、それが後で別のスレッドで変更されたかどうかを確認したい.
例
info = GetInfo(path);
checkInfo=info; // I make changes to info later, but I wanna checkInfo to remain the same
info 変数を複製するか、再割り当てする必要があります。クローンを作成するのは手作業でかなりの作業になり、壊れやすい可能性が高いため、次のような方法をお勧めします。
checkInfo = info:
info = GetInfo(path);
もう 1 つのオプションは、ここに来る前に info 変数を変更しなかった場合、GetInfo を使用して checkInfo を設定することです。その場合、GetInfo は両方に対して同じオブジェクトを構築するため、同じ結果が得られるという事実を考慮してください。
あなたの質問を理解する限り、情報オブジェクトのディープコピーを作成する必要があります
これが解決策です(シリアル化を使用)
次のような拡張メソッドを作成します。
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 通常、ディープ クローニングの必要性は、コード リファクタリングの必要性を意味します。必ずしもそうではありませんが、かなり頻繁に..オブジェクトをコピーするよりも、あなたの場合にはより良い解決策があるはずです。
FileInfo クラスを別のクラスで非表示/ラップし、他のスレッドがラッパー クラスのみにアクセスできるようにすることができます。ラッパー クラスは、他のスレッドが FileInfo を変更したときに、FileInfoChanged などのイベントを発生させることができます。