1

プロファイルを使用して設定などを保存するファイルバックアッププログラムを作成しています。現時点では、構造は次のようになっています。

MainFormには、多数のProfileHandlerプロファイル オブジェクトを持つ があります。

プログラムに変更を加えると (リストへのファイルの追加、宛先パスの変更など)、設定は一時プロファイルに保存されます。ここまでは順調ですね...

しかし、プロファイルを保存したいとき、どちらに行けばよいか本当に決められません。現在、一時的なプロファイル オブジェクトを のAddProfileメソッドに渡しますProfileHandler。メソッドは次に、一時的なプロファイル オブジェクトのプロパティをパラメーターとして使用して、新しいプロファイル オブジェクトを作成します (ただし、List<string>Addrange でコンテンツをコピーするだけの a は除きます)。

それは機能しますが、それは良いですか?

public bool AddProfile(Profile tempProfile)
{
    if (tempProfile != null)
    {
        Profile profile = new Profile(tempProfile.Name, tempProfile.TargetPath);
        profile.Filelist.Clear();
        profile.Filelist.AddRange(tempProfile.Filelist);
        _profiles.Add(profile);
    }
    return (tempProfile != null);
}

それを行うよりスマートな方法はありますか?Profileどういうわけか、の単純なコピーであるオブジェクトの新しいインスタンスを作成する簡単な方法が必要だと感じていますtempProfile。私の場合、Profileクラスには 3 つのフィールドしかないので簡単ですが、大量のフィールドがある場合はどうなるでしょうか?

私はあまりにも不明確ではないことを願っています。私はこれに少し慣れていません。

4

3 に答える 3

1

保護されたobject.MemberwiseCloneメソッドをチェックアウトすることができます。この方法は、初期の頃からありました。

void Main()
{
    Profile p = new Profile("bob", @"c:\foo");
    p.FileList.Add("bar.txt");

    Profile copy = p.DeepCopy();
    copy.FileList.Clear();
    copy.FileList.Add("baz.log");

    p.Dump("p");
    copy.Dump("copy");
}

public class Profile
{
    public Profile(string name, string targetPath)
    {
        this.Name = name;
        this.TargetPath = targetPath;
        this.FileList = new List<string>();
    }

    public Profile DeepCopy()
    {
        Profile copy = (Profile)this.MemberwiseClone(); // this takes care of Name & TargetPath
        copy.FileList = new List<string>(this.FileList);
        return copy;
    }

    public string Name { get; private set; }
    public string TargetPath { get; private set; }
    public List<string> FileList { get; private set; }
}

MemberwiseClone浅いビット単位のコピーを作成することと考えることができます。これは通常、int、double、floatなどの値型、およびstringなどの不変の参照型でも問題ありません。List<string>ただし、プロファイルクラスのように変更可能な参照型のコピーを作成して、コピーの変更によって元の参照型も変更されないようにする必要があります。これは、メンテナンスの点で一種の細かな点です。新しい可変プロパティを追加する場合は、クローン作成が行われた後、ディープコピーメソッドでコピーを作成することを忘れないでください。

デザインによっては、イベント登録など、コピーしたくないものが他にもある可能性があります。これらは過渡現象と考えることができます。アプリがマルチスレッドの場合も注意が必要です。コピー中に、オブジェクトの整合性を維持するために他の場所で行うのと同じ苦労をする必要があります(たとえば、ロックを取得します)。

パフォーマンスの数値はありません。とにかく、どんなアドバイスをしても、それが十分に速いかどうかを確認するために、独自のパフォーマンステストを行うのに最適です。

于 2012-08-26T21:29:46.510 に答える
1

ディープ コピーを作成してtempProfile保存できます。これがサンプル コードです ソース.NET (具体的には C#) でオブジェクトのディープ コピーを行うにはどうすればよいですか?

public static T DeepClone<T>(T obj)
{
 using (var ms = new MemoryStream())
 {
   var formatter = new BinaryFormatter();
   formatter.Serialize(ms, obj);
   ms.Position = 0;

   return (T) formatter.Deserialize(ms);
 }
}
于 2012-08-26T20:46:15.430 に答える
1

Profile を受け取り、次のようにコピーを行うコンストラクターを作成するだけです。

public Profile(Profile profileToCreateFrom)
    : this(profileToCreateFrom.Name, profileToCreateFrom.TargetPath)
{
    FileList = profileToCreateFrom.FileList.Select(file => file).ToList();
}

次に、次のように新しいものを追加します。

_profiles.Add(new Profile(tempProfile));
于 2012-08-26T20:51:39.813 に答える