2016-11-04 85 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

哇谢谢那么一个好的抓住将会标志着很好的答案 –