場合によっては、コピーするインスタンスがまだ元の初期 オブジェクトを 参照 しているため、問題を解決するために浅いコピーが必要になることがあります。しかし、これでは不十分な場合があります。コピーするインスタンスはローカル値の変更と参照型の調整を行う必要があり、初期オブジェクトには影響を与えないことが保証されているためです。
これにはディープコピーが必要です!
要件は次のとおりです:
まず、浅いコピーでは要件を満たせない理由を見てみましょう: 履歴書をコピーしたいのですが、コピーされたバージョンはテンプレートの求人応募意図の会社名とのみ矛盾しています。再開する。
最初のバージョンのコードは次のとおりです:
ResumeModelバージョン 1.0
public class ResumeInfo1:ICloneable { public ResumeInfo1(string name, string telephone, EducationInfo educationInfo,WantedJob1 job) { this._name = name; this._telephone = telephone; this._educationInfo = educationInfo; this._wantedJob = job; } private string _name; public string name { get { return this._name; } } private string _telephone; public string telephone { get { return _telephone; } } private EducationInfo _educationInfo; public EducationInfo educationInfo { get { return _educationInfo; } } private WantedJob1 _wantedJob; public WantedJob1 WantedJob { get { return _wantedJob; } } public object Clone() { return this.MemberwiseClone(); } }
ネストされたサブクラス学歴オブジェクト EducationInfo
public class EducationInfo { public string schoolName { get; set; } public DateTime enrollTime { get; set; } public DateTime leaveTime { get; set; } }
ネストされたオブジェクト WantedJob1:
public class WantedJob1 { public string companyName { get; set; } public double eanrings { get; set; } }
私たちは顧客の中にいます端末の使用:
EducationInfo educationInfo = new EducationInfo(); WantedJob1 wantedJob = new WantedJob1(); ResumeInfo1 templateResume = new ResumeInfo1("qaz", "18810002000", educationInfo, wantedJob); educationInfo.enrollTime = new DateTime(2010, 7, 1); educationInfo.leaveTime = new DateTime(2015, 1, 1); educationInfo.schoolName = "wsx"; wantedJob1.companyName = "edc"; wantedJob1.eanrings = 1000; //假定各个简历版本,仅仅companyName属性值不同。 var res1 = templateResume.Clone(); (res1 as ResumeInfo1).WantedJob.companyName = "baidu"; var res2 = templateResume.Clone(); (res1 as ResumeInfo1).WantedJob.companyName = "ali";
しかし、取得した会社名はすべて「ali」です
これは典型的な浅いコピーです!
会社名を区別するという要件を満たせないため、変更を続けてディープコピーに変換します:
public class ResumeInfo2:ICloneable { public ResumeInfo2(string name, string telephone, EducationInfo educationInfo,WantedJob2 job) { this._name = name; this._telephone = telephone; this._educationInfo = educationInfo; this._wantedJob = job; } // private void cloneJob(WantedJob2 job) { this._wantedJob = job.Clone() as WantedJob2; } private string _name; public string name { get { return this._name; } } private string _telephone; public string telephone { get { return _telephone; } } private EducationInfo _educationInfo; public EducationInfo educationInfo { get { return _educationInfo; } } private WantedJob2 _wantedJob; public WantedJob2 WantedJob { get { return _wantedJob; } } public object Clone() { cloneJob(this._wantedJob); return new ResumeInfo2(_name,_telephone,_educationInfo,_wantedJob); } }
求職意図オブジェクト 2.0:
//WantedJob2 实现接口 public class WantedJob2:ICloneable { public string companyName { get; set; } public double eanrings { get; set; } public object Clone() { return this.MemberwiseClone(); } }
クライアントコール:
//此处我们需要对WantedJob做深复制处理。 EducationInfo educationInfo = new EducationInfo(); WantedJob2 wantedJob = new WantedJob2(); ResumeInfo2 templateResume = new ResumeInfo2("qaz", "18810002000", educationInfo, wantedJob); educationInfo.enrollTime = new DateTime(2010, 7, 1); educationInfo.leaveTime = new DateTime(2015, 1, 1); educationInfo.schoolName = "wsx"; wantedJob.companyName = "edc"; wantedJob.eanrings = 1000; //假定各个简历版本,仅仅companyName属性值不同。 var res1 = templateResume.Clone(); (res1 as ResumeInfo2).WantedJob.companyName = "baidu"; var res2 = templateResume.Clone(); (res2 as ResumeInfo2).WantedJob.companyName = "ali";
別の会社名を取得してください!ディープコピーが成功しました!
以上が.NET Framework - Clone を浅いものから深いものに変更する方法の詳細なサンプル コードの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。