实例和字典的问题

时间:2010-09-28 14:56:55

标签: c# dictionary instance

我尝试使用基于力量的2D舰船游戏。 我有一个存储在字典中的Forces,用于船上的'Jets'。所以我只需说出名称,振幅并让发动机进行加速/旋转。

为此,我必须将力旋转到船的局部坐标,然后才能应用它,而只是旋转新力,它还会旋转存储在词典中的力。是什么导致部队旋转。

Force f1 = new Force();
f1 = Player.JetsDict["RearRight"];
f1.Position = Vector2.Transform(f1.Position, Matrix.CreateRotationZ(Player.Rotation));

虽然这段代码没有改变存储在字典中的实例(但我不想使用它,因为它的时间越长,我就有很多力量要处理):

Force f1 = new Force();
f1.Position = Player.JetsDict["RearRight"].Position;
f1.Vector = Player.JetsDict["RearRight"].Vector;
f1.Position = Vector2.Transform(f1.Position, Matrix.CreateRotationZ(Player.Rotation));

为什么?

Greg the Mad

3 个答案:

答案 0 :(得分:0)

Force f1 = new Force();
f1 = Player.JetsDict["RearRight"];

该代码重置f1对词典中的引用的引用。 f1是字典元素的别名。当你改变它时,你改变字典中的内容。

你想要的是Force上的.clone()函数:

Force f1 = Player.JetsDict["RearRight"].clone();

或复制构造函数:

Force f1 = new Force(Player.JetsDict["RearRight"]);

答案 1 :(得分:0)

存储在字典中的是引用Force的实例(假设它是一个类,而不是结构)。如果修改值引用的对象,则它将保持修改状态。

我的猜测是,您目前没有牢固掌握参考类型和价值类型......我有一个article可能会对您有所帮助。这是一个值得理解的关键主题。

有点像两个人在他们的电话簿中有相同的朋友的地址:如果我查看我朋友的地址,然后将他们房子的前门涂成红色,然后查找相同的地址一个人的地址,并访问他们的房子,你会看到一个红色的前门。重要的是, house 不在电话簿中 - 只有地址是。同样地,Force 对象不在字典中 - 只有引用。

答案 2 :(得分:0)

由于Force被定义为类(class Force),当您从Dictionary中获取副本时,您只是获得对Force实例的引用 - 存储的相同Force实例在字典中。对该引用中的成员进行更改将反映在使用它的程序中的任何位置。

这里唯一的选择是创建一个新实例。这就是你在第二种情况下所做的事情。

但是,如果Force只是一个Position和一个Vector,我会考虑将它作为一个结构而不是一个类。结构总是按值而不是按引用复制,这会导致原始代码按预期方式工作。但是,如果还有更多,那么一个类仍然是最佳选择,在这种情况下,第二个选项是最好的解决方案。

但是,您可以通过添加一个以Force作为参数的新构造函数来缩短它,并复制Position + Vecotr。那会让你写:

Force f1 = new Force(Player.JetsDict["RearRight"]);
f1.Position = Vector2.Transform(f1.Position, Matrix.CreateRotationZ(Player.Rotation));