0

我正在创建一个吉他标签程序。

您选择音符(游戏对象),输入和弦名称(字符串),然后按下按钮将“和弦”添加到列表中。

Chord 类只是一个字符串和一个游戏对象列表。我使用 currentChord 来保存当前的选择/名称。

当我选择一个音符时,我将它添加到 currentChord.selectedList。

当我输入一个名字时,我将其设为 currentChord.name。

Chord currentChord;
List<Chord> allChords;

当我单击一个按钮时,currentChord 被添加到 allChords (allChords.Add(currentChord))。

问题是它是实例化的。因此,当我单击添加不同的选择/名称时,allChords.notes 列表中所有内容的选择都会更改...

我必须使用“新”关键字吗?

4

2 回答 2

3

是的,您必须使用new关键字。

您一遍又一遍地将同一个实例添加到列表中,因此您最终会得到一个对同一实例的引用列表。

从数据中创建一个新实例currentChord以添加到列表中,或者将实例添加currentChord到列表中,然后创建一个新实例并分配给currentChord

于 2012-05-27T12:25:56.587 回答
1

您可能还需要考虑可用于定义的struct和关键字之间的区别。using将提供值类型的行为, where将提供引用类型的行为。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 回答