C# 实例和字典的问题

C# 实例和字典的问题,c#,dictionary,instance,C#,Dictionary,Instance,我试着做一个基于原力的2D飞船游戏。 我有一个储存在字典里的力,表示船上的“喷气机”。所以我只需要说出名字,振幅,让发动机做加速/旋转 为此,我必须先将力旋转到船的局部坐标,然后才能应用它,但它不仅旋转新的力,还旋转字典中存储的力。是什么导致力旋转 Force f1 = new Force(); f1 = Player.JetsDict["RearRight"]; f1.Position = Vector2.Transform(f1.Position, Matrix.CreateRotation

我试着做一个基于原力的2D飞船游戏。 我有一个储存在字典里的力,表示船上的“喷气机”。所以我只需要说出名字,振幅,让发动机做加速/旋转

为此,我必须先将力旋转到船的局部坐标,然后才能应用它,但它不仅旋转新的力,还旋转字典中存储的力。是什么导致力旋转

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));
为什么?

疯狂的格雷格

Force f1 = new Force();
f1 = Player.JetsDict["RearRight"];
该代码将f1的引用重置为字典中的引用。f1则是字典元素的别名。当你改变它时,你就改变了字典里的内容

您需要的是强制的.clone函数:

或复制构造函数:

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

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

我的猜测是,您目前对引用类型和值类型没有很好的把握。。。我有一个可以帮助你的计划。这是一个真正需要理解的关键话题

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

因为Force被定义为类Force,当您从字典中获取副本时,您只获得对Force实例的引用-与字典中存储的Force实例相同。对该引用中的成员进行更改将反映在使用该引用的程序中的任何地方

这里唯一的选择是创建一个新实例。这就是你在第二个案例中所做的

但是,如果力只是一个位置和一个向量,我会考虑把它构造成一个结构,而不是一个类。结构总是按值而不是按引用进行复制,这将导致原始代码按预期方式工作。但是,如果还有更多问题,那么类仍然可能是最佳选择,在这种情况下,第二个选项是最佳的潜在解决方案

不过,您可以通过添加一个新的构造函数来缩短它,该构造函数将Force作为参数,并复制Position+Vecotr。这样你就可以写:

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

顺便说一句,如果你打算使用克隆,而克隆有其他问题,你可能想实现IClonable并使其成为克隆[而不是克隆]。好的,谢谢你的帮助。谢谢你和其他人的评论。
Force f1 = new Force(Player.JetsDict["RearRight"]);
f1.Position = Vector2.Transform(f1.Position, Matrix.CreateRotationZ(Player.Rotation));