-1

IDに基づいて前のレコードから新しいレコードをコピーする次のコードがあります。

 //selecting the employee to be copied.
 Employee emp=employeeList.Where(p=>p.Id==2).Single();

 //Increasing the Employee Id.
 Employee NewEmp=new Employee();
 NewEmp=emp;
 NewEmp.Id=employeeList.Max(p=>p.Id)+1;

 //Adding to the List.
 employeeList.Add(NewEmp);

ただし、新しいレコードは正常に追加されています。コンテキストであるため、既存の Record Id も New Max Id 3 に変更されました。

既存のレコード オブジェクトの更新を停止するのを手伝ってくれませんか。

4

4 に答える 4

1

これを書くとき:

Employee NewEmp=new Employee();
NewEmp=emp;

新しいオブジェクトを作成し (1 行目)、次に (2 行目) 変数 NewEmp に "emp" を割り当てます。これらは両方とも同じオブジェクトを参照するため、実際には 1 つのオブジェクトで作業します。実際に作成した新しい従業員は、GC によって収集されます。

値型と参照型の違いからより多くを学ぶことができます。

于 2012-11-27T11:17:57.440 に答える
1

ここで行う割り当て:

Employee NewEmp=new Employee();

はまったく効果がなく、新しいインスタンスはすぐに次の行によって破棄されます。

NewEmp=emp;

empフィールドごと(プロパティごと)の内容をコピーする必要があります。あなたの場合、実装することをお勧めしますICloneableEmployeeドキュメントについては MSDNを参照してください。

別のオプションは次のとおりです。

ただし、予想されるスキルレベルに関しては、どちらの方法もお勧めしません。


注: 'newEmp' のように、ローカル変数の名前を小文字で始めるのが一般的です。

于 2012-11-27T11:18:44.290 に答える
0

oldEmployeeNewEmp変数に代入し、 を 3 に更新しNewEmp.Idています。次に、同じEmployeeものをリストに再度追加しています。したがって、リストには と同じ が 2 つありEmployeeますId = 3

于 2012-11-27T11:18:44.693 に答える
0

この行

newEmp = emp;

コピーしませんemp。メモリ内の同じ場所への新しい参照を作成するだけです。したがって、効果的empnewEmpは 1 つと同じですが、2 つの別個のメモリ ブロックではありません。「参照型」については、こちらをご覧ください: http://www.albahari.com/valuevsreftypes.aspx

于 2012-11-27T11:25:25.283 に答える