2012-05-27 78 views
0

我正在創建一個吉他選項卡程序。您選擇音符(遊戲對象),輸入和絃名稱(字符串),然後按按鈕將「和絃」添加到列表中。將變量添加到沒有實例化的數組/列表中

Chord類只是一個String和一個GameObjects列表。我使用currentChord來保存當前的選擇/名稱。

當我選擇一個筆記,我將它添加到currentChord.selectedList。

當我鍵入一個名稱時,我將它設爲currentChord.name。當我點擊一個按鈕時,currentChord被添加到allChords(allChords.Add(currentChord))。

問題是它是實例化的。所以,當我點擊添加不同的選擇/名稱時,allChords.notes列表中所有內容的選擇都會更改...

我必須使用「新」關鍵字嗎?

回答

2

是的,你必須使用new關鍵字。

您一次又一次向列表中添加相同的實例,因此您最終得到一個對同一實例的引用列表。

currentChord的數據創建一個新的實例添加到列表,或在currentChord添加實例的列表,然後創建一個新的實例,並分配給currentChord

+0

如果我複製currentChord ,Chord的字符串/列表仍然是實例化的嗎?所以我必須創建一個字符串/列表變量的新副本,然後將它們設置爲Chord變量? – st4rdog

+0

@ st4rdog:如果你複製'currentChord'變量,你只需要複製對象的引用,所以你仍然只有一個對象。您必須創建一個新實例才能獲得副本。如果'GameObject'列表可以更改,則必須創建一個新列表,而不僅僅是複製引用。如果每個「GameObject」都可以更改,則必須創建每個對象的新實例,而不僅僅是將引用複製到新列表中。 – Guffa

0

您可能還想考慮可用於定義Chord的關鍵字structclass之間的差異。使用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

相關問題