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

C# 将变量添加到数组/列表而不实例化,c#,instance-variables,instances,C#,Instance Variables,Instances,我正在创建一个吉他标签程序 选择音符(游戏对象),键入和弦名称(字符串),然后按按钮将“和弦”添加到列表中 Chord类只是一个字符串和一个游戏对象列表。我使用currentChord保存当前选择/名称 选择注释时,我会将其添加到currentChord.selectedList 键入名称时,将其设为currentChord.name Chord currentChord; List<Chord> allChords; Chord当前Chord; 列出所有和弦; 单击按钮时,cu

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

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

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

选择注释时,我会将其添加到currentChord.selectedList

键入名称时,将其设为currentChord.name

Chord currentChord;
List<Chord> allChords;
Chord当前Chord;
列出所有和弦;
单击按钮时,currentChord将添加到AllChord(AllChord.Add(currentChord))

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


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

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

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


currentChord
中的数据创建一个新实例以添加到列表中,或者在代码< > CurrhorChord <代码>中添加实例,然后创建一个新的实例并赋值给<代码> CurrhorChord .< /P> < p>您还可以考虑<代码>结构> <代码>和<代码>类< /代码>关键字,这些关键字可以用来定义<代码>和弦< /代码>。使用
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
这是引用类型行为:

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提供了一个很好的描述:

如果我复制当前的弦,弦的字符串/列表还会是实例吗?因此,我必须创建一个新的字符串/列表变量副本,然后将它们设置为Chord变量?@st4rdog:如果复制
currentChord
变量,您将只复制对对象的引用,因此您仍然只有一个对象。您必须创建一个新实例才能获得副本。如果
GameObject
的列表可以更改,您必须创建一个新列表,而不仅仅是复制引用。如果每个
GameObject
都可以更改,那么您必须创建每个对象的新实例,而不仅仅是将引用复制到新列表中。