遇到“this”修饰符的问题

时间:2010-05-18 16:41:04

标签: c# this

我在City类中有这个方法。它应该根据应用该方法的对象创建一个新城市:

 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;
    }

CityCenter的类型为“Point”,它有两个字段 - x,y。 Point类中的Move方法用于更改CityCenter位置。它看起来像这样:

 public void Move(int dX, int dY)
    {
        this.X = x + dX;
        this.Y = y + dY;
    }

新对象c和现有City对象都会发生变化。我认为“this”修饰符也适用于现有对象......

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

3 个答案:

答案 0 :(得分:4)

我怀疑City c=new City(this);正在创建当前City的克隆,这意味着它们都共享相同的Point对象(如果Point是类而不是结构,则只能为true)

你可以改为City c=new City();吗?

答案 1 :(得分:2)

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

  • 克隆城市时创建新的Point对象
  • 将Point设为值类型(以便创建独立副本
  • 将Point设为不可变类型并更改Move以返回点并进行相关更改

(或上述的一些组合......)

听起来像Point应该可能是一个值类型(结构)。请注意,结构应该始终是不可变的。

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

答案 2 :(得分:1)

我的猜测是Point是一个类,所以你要分享对该点的同一个实例的引用。您需要创建Point的新实例并将其分配给新的City.CityCenter