【发布时间】:2011-06-25 20:52:11
【问题描述】:
class Player
{
private Location location;
public Location getLocation()
{
return location;
}
public void setLocation(Location location)
{
this.location = location;
}
}
...
class Location
{
int x,y,z;
public Location(int x, int y, int z)
{
this.x = x;
this.y = y;
this.z = z;
}
public Location(Location location)
{
this.x = location.x;
this.y = location.y;
this.z = location.z;
}
public void updateLocation(Location location) //the fix..
{
this.x = location.x;
this.y = location.y;
this.z = location.z;
}
}
说..你愿意
Player p1 = new Player();
Player p2 = new Player();
p1.setLocation(p2.getLocation());
现在当您尝试修改其他人的位置时会出现错误/问题。两个玩家的位置变化完全相同,因为他们现在共享相同的位置。
所以当然下面的就可以了。
p1.setLocation(new Location(p2.getLocation()));
但问题是它总是创建一个新对象..当我可以更新现有实例时..?如何在默认情况下更新现有实例,而无需像下面那样创建自己的方法来解决此问题。
我必须使用下面的方法来解决这个问题(默认情况下,任何方式都可以做到这一点,而不是像下面这样)
public void setLocation(Location location)
{
if (this.location == null)
this.location= new Location(location);
else
this.location.updateLocation(location);
}
有人知道我可能不知道的技巧吗?谢谢。
【问题讨论】:
-
您可以将
Location设为结构。然后,它将按值传递。这将起作用,因为您的位置对象基本上是其他值类型的容器,并且相对较小。 -
它还有其他方法,如 .Equals() 和 .withinDistance(other Location) 等。
-
您可以将成员添加到结构中。只需保持较小,并记住结构越大,它在堆栈上占用的内存就越多。这是 msdn 的 C# 结构体编程指南链接:msdn.microsoft.com/en-us/library/saxz13w4(v=VS.90).aspx
-
只是与您的问题无关的注释:在 C# 中,您应该使用属性,而不是类似 Java 的 get 和 set 方法。
-
为什么每次出现问题都要创建一个新对象?
标签: c# visual-studio multiple-instances default-copy-constructor