2

最近、プログラムで問題が発生しました。ユーザー定義クラスのリストを使用すると、データが破損します。例:

class myClass {
    public int x;
}

myList<myClass> = new List<myClass>();
myClass myObject = new myClass();

myList.Add(myObject);
myList.Remove(myObject);

リストに何かを追加しようとすると、データが破損しています。オブジェクトを削除することも問題を引き起こしていると思いますが、これはそもそもオブジェクトが破損していることが原因である可能性があります。私はあちこちで同様の問題を見てきました、誰かが私に何が起こっているのか説明してくれることを望んでいました。リンクは私にいくつかの答えを提供しますが、舞台裏で何が起こっているのかを説明するのに良い仕事をしていません。

編集:私のデータがどのように破損しているかについて、以前はもっと明確にすべきでした。オブジェクトのフィールドの値は、リストに追加されるときに変更されます。私のプログラムでは、値はすべて0または1である必要がありますが、リストに追加すると-1から3に変更されます。

編集2:問題の原因はC#の不慣れでした。C ++のバックグラウンドから来て、オブジェクトは参照ではなく値によって渡されると思いました。カスタムクラスをクラスから構造体に変更すると、問題はすぐに解決しました。@MattWに感謝します!

4

1 に答える 1

5

ここで進むことはあまりありません-したがって、以下は問題の推測です...

myObjectに追加した後、の値を変更しますList<>か?リストにを追加しているのでClass(そしてすべてのクラスは参照型であるため)、リストに追加した後にの値を変更すると、すべてのmyObject場所(内部を含む)で変更されることに注意してくださいList<>

例えば:

List<myClass> myList = new List<myClass>();
myClass myObject = new myClass();
myObject.x = 5;

myList.Add(myObject);
Console.WriteLine(myList[0].x); //this will be 5

myObject.x = 7;
Console.WriteLine(myList[0].x); //this will be 7

自分自身に触れていなくてもList<>、Referencedオブジェクトの値を変更したため、参照されているすべての場所で変更されます。

チェックアウト値と参照型

于 2012-09-14T13:33:50.483 に答える