将变量添加到数组/列表而不实例化

本文关键字:列表 实例化 数组 变量 添加 | 更新日期: 2023-09-27 18:35:31

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

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

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

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

当我键入名称时,我会将其设为 currentChord.name。

Chord currentChord;
List<Chord> allChords;

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

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

我必须使用"新"关键字吗?

将变量添加到数组/列表而不实例化

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

您一遍

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

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

您可能

还需要考虑可用于定义Chordstructclass关键字之间的区别。 使用 struct 将提供值类型行为,其中class将提供引用类型行为。

例如,这是值类型行为:

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