0

ギターのタブプログラムを作成しています。

ノート(GameObject)を選択し、コード名(文字列)を入力してから、ボタンを押して「コード」をリストに追加します。

Chordクラスは、単なる文字列とGameObjectsのリストです。currentChordを使用して、現在の選択/名前を保持します。

メモを選択したら、それをcurrentChord.selectedListに追加します。

名前を入力するときは、currentChord.nameにします。

Chord currentChord;
List<Chord> allChords;

ボタンをクリックすると、currentChordがallChordsに追加されます(allChords.Add(currentChord))。

問題は、インスタンス化されていることです。したがって、クリックして別の選択/名前を追加すると、allChords.notesリスト内のすべての選択が変更されます...

「new」キーワードを使用する必要がありますか?

4

2 に答える 2

3

はい、newキーワードを使用する必要があります。

同じインスタンスをリストに何度も追加しているため、同じインスタンスへの参照のリストが作成されます。

データから新しいインスタンスを作成currentChordしてリストに追加するか、インスタンスをリストに追加してcurrentChordから新しいインスタンスを作成してに割り当てますcurrentChord

于 2012-05-27T12:25:56.587 に答える
1

を定義するために使用できるstructとキーワードの違いを検討することもできます。を使用すると、値型の動作が提供され、参照型の動作が提供されます。classChordstructclass

たとえば、これは値型の動作です。

struct Chord
{
    public string Name;
}

...

Chord cMajor = new Chord;
cMajor.Name = "C Major";
Chord cMinor = cMajor; // Make a copy of the Chord instance
cMinor.Name = "C Minor";

Assert.That(cMajor.Name, Is.EqualTo("C Major")); // Assertion succeeds

これは参照型の動作です。

class Chord
{
    public string Name;
}

...

Chord cMajor = new Chord;
cMajor.Name = "C Major";
Chord cMinor = cMajor; // No copy of the Chord instance, just another reference
cMinor.Name = "C Minor";

Assert.That(cMajor.Name, Is.EqualTo("C Major")); // Assertion fails
Assert.That(cMajor.Name, Is.EqualTo("C Minor")); // Assertion succeeds

MSDNは素晴らしい説明を提供します:http://msdn.microsoft.com/en-us/library/aa288471 (v = vs.71).aspx

于 2012-05-27T12:33:06.410 に答える