C# 与「;这";修饰语

C# 与「;这";修饰语,c#,this,C#,This,我在城市班上有这种方法。它应该基于应用该方法的对象创建一个新城市: public City newCity(string newCityName, int dX, int dY) { City c=new City(this); //based on a constructor : City(City c){} c.CityName=newCityName; c.NoOfNeighborhoods=1; c.NumOfR

我在城市班上有这种方法。它应该基于应用该方法的对象创建一个新城市:

 public City newCity(string newCityName, int dX, int dY)
    {
        City c=new City(this); //based on a constructor : City(City c){}

        c.CityName=newCityName;
        c.NoOfNeighborhoods=1;
        c.NumOfResidents=0;
        c.CityCenter.Move(dX,dY);

        return c;
    }
城市中心是“点”类型,有两个字段-x,y。 Point类中的Move方法用于更改城市中心位置。看起来是这样的:

 public void Move(int dX, int dY)
    {
        this.X = x + dX;
        this.Y = y + dY;
    }
新对象c和现有城市对象都发生了更改。我认为“这个”修改器也适用于现有对象

如何利用Move方法而不导致这种行为?
注意:这是一个封闭的API,因此我只能将私有方法添加到项目中。

我怀疑
City c=new City(this)
正在创建当前城市的浅层克隆,这意味着它们都共享同一个Point对象(只有Point是类而不是结构时才可能为真)


你会做城市c=新城()吗取而代之?

我猜Point是一个类,因此您正在共享对同一个Point实例的引用。您将需要创建点的新实例并将其分配给新城市。CityCenter

问题是(几乎可以肯定)两个城市都引用了相同的
对象。更改对象时,将通过两个引用看到该更改。选项:

  • 克隆城市时创建新的点对象
  • 使点成为值类型(以便制作独立副本
  • 将点设置为不可变类型,并更改
    Move
    以返回一个新点,并进行相关更改
(或上述的一些组合…)

在我看来,Point可能应该是一种值类型(结构)。请注意,结构几乎总是不可变的


首先有一个
newCity
实例方法似乎有点奇怪-新城与旧城有什么关系?你为什么不创建一个完全独立的城市?

city(city c){}
中发布代码可能会有所帮助。你能发布
city(city c)的代码吗
constructor?我怀疑它创建了一个浅拷贝,因此
CityCenter
属性引用了相同的
Point
实例。Point不是一个结构而不是一个类有什么原因吗?Point不是.NET framework中已经提供的现有结构有什么原因吗公共城市(c城):这(c城名,c城中心,c中心站,c努姆居民,c努夫八区){}@用户344246:是的,那么事实上,你的两个城市最终都有了相同的
CityCenter
对象。这是你的问题。取决于这是否有效,你可能还需要为你的新城市创建一个新的CityCenter…c.CityCenter=new CityCenter();Jon Skeet的最佳建议并不奇怪:)我同意这一点应该是不变的。好吧,这是一个给定的API,所以我不能更改它:(这样做的原因是,此newCity方法将基于给定城市创建一个新的城市,并更改CityName,城市中心将根据dX移动,dY@user344246当前位置你不能改变多少?目前显然已经打破了……考虑到街区的数量和居民的数量也已经设定好了,你能改变多少它和原来的有共同点吗?只有中央车站?我只需要中央车站x,y来创建基于thoseGuys的新城市!非常感谢。我有问题了……你帮了我很大的忙:)