2016-11-04 82 views
0

我一直讓我的所有數組都填充了我遊戲中的同一個對象,該對象使用此數組來跟蹤衍生對象的列表。它有代碼,基本上是:Visual Studio斷點問題

for(int i = 0; i < wildPets.Length; i++) 
{ 
    Pet pet = new Pet(); 
    wildPets[i] = pet; 
} 

現在,當我剛剛運行的代碼,所有的寵物都是一樣的,因爲它只是做了一個新的寵物,並將其分配給陣列的各項指標(名稱相同, ID,HP等)。我使用斷點功能來檢查爲什麼會發生這種情況,並注意到當我遍歷代碼時,對象總是不同的,但沒有斷點發生錯誤。我認爲斷點是一個非常有用的功能,但是現在我不知道它是否真正代表我的代碼。有什麼我在這裏失蹤。我有一個可以發佈

構造示例代碼:

public Pet() 
{ 
    Random r = new Random(); 

    type = ToType(r.Next(10)); 

    double temp = (GetHP(type, r)); 

    if (temp > 0) 
    { 
     hp5 = temp; 
    } 

    temp = (GetSpeed(type, r)); 
    if (temp > 0) 
    { 
     speed5 = temp; 
    } 

    level = r.Next(5, 16); 
    rarity = r.Next(100); 
    rarityLevel = GetRarity(); 
    DisplayImage = frmMain.petImages[petID]; 
    abilities = FillAbilities(type, abilities); 
} 

它與隨機水平,稀有性,ID,和其他的東西一個新的寵物。我使用的是手錶部分是視覺工作室。兩張圖片顯示了在後臺運行的方法和數組的內容,以及當我設置斷點並逐行執行時。一個陣列中充滿了具有相同ID的寵物(相同的一切,ID只是一種快速注意的方式),另一個陣列中充滿了新的不同的寵物對象,例如代碼應該如何運行。

所有相同的寵物(無斷點) enter image description here

所有不同的寵物(與斷點) enter image description here

+0

相同的對象,但不同的實例,這是什麼代碼這樣做 – Fredou

+0

如何檢查對象是否相同? – Peter

+2

我不知道你在問什麼。你可以詳細說明你的問題還是你的代碼?另外'沒有斷點發生錯誤'<=什麼錯誤,你沒有提供例外或錯誤消息。爲什麼他們是相同的,你有一個循環,併爲數組中的每個項目創建一個新的寵物。 – Igor

回答

1

這樣做的原因是,你正在創建每次你構造一個新的Random對象時,它叫做。構造函數使用當前系統時間生成一個新的隨機種子。在逐步調試調試器中的代碼時,每次連續調用之間會有足夠的時間爲每個Pet生成一個新種子。但是,如果在不進行調試的情況下運行代碼,代碼執行速度會很快,以致隨機種子不會更改。

在構造函數之外移動Random對象的創建。例如:

public class Pet 
{ 
    private static readonly Random _rand = new Random(); 

    public Pet() 
    { 
     type = ToType(_rand.Next(10)); 
     // ... 
    } 
} 

您可以考慮使所述隨機種子或隨機對象作爲參數給構造(或到該初始化對象的靜態方法或工廠方法)。這將允許您在需要時確定性地創建Pet對象。

更好的方法是創建一個隨機數生成接口並將其傳遞給構造函數,允許將隨機數生成器稍後更改或模擬以用於測試目的。

+0

哇謝謝那麼一個好的抓住將會標誌着很好的答案 –