重新初始化不起作用的物体

时间:2014-10-25 12:10:03

标签: c# .net

我遇到了一些问题'重置'一个对象回到一些默认值。

所以我有一个名为MPoint类型的对象(我自己的类)。如果该点的使用次数超过一定次数,我希望将该点重置为其默认值。所以我创建了一个名为CheckPointExpired的方法,如下所示。

问题是调用方法,如果Point属性PointUsed大于MaxResuse,则将point对象置为null并创建一个新点。但是,当在RunPoint方法中调试我的代码时,我可以看到点对象没有更改值。我不明白为什么?

据我所知,当我将点对象传递给方法CheckPointExpired时,它作为引用传递,所以对象的任何更改都应该反映在RunPoint方法中?显然我不理解某事。

  public MPoint RunPoint(MPoint point)
  {
      // first check if point has expired
      CheckPointExpired(point)

      // rest of my code
  }

  void CheckPointExpired(MPoint point)
  {
     if (point.PointUsed >= point.MaxResuse)
     {
        int lvl = point.Level;
        int maxLB = point.MaxLookBack;
        int maxReuse = point.MaxResuse;
        int order = point.Order;            

        point = null;
        point = new MPoint(maxReuse, maxLB, lvl, order);
     }
  }

2 个答案:

答案 0 :(得分:4)

您需要使用ref关键字将点作为参考传递:

void CheckPointExpired(ref MPoint point)
{
    if (point.PointUsed >= point.MaxResuse)
    {
       int lvl = point.Level;
       int maxLB = point.MaxLookBack;
       int maxReuse = point.MaxResuse;
       int order = point.Order;            

       point = null;
       point = new MPoint(maxReuse, maxLB, lvl, order);
   }
}

CheckPointExpired(ref point);

否则你只能改变点的字段或属性,它们将在原始对象上可见,但是一个分配不会改变传递的参数的引用。即使类是引用类型,你不能使用ref参数实际上是原始参考的副本.Eg:

string foo = "Foo";
string bar = foo;

此处,作业bar = foo复制了foo对bar的引用。因此,有两个不同的引用指向同一位置。无论何时使用其他值初始化bar,它只会丢弃旧引用并且不会&# 39;影响foo

bar = "bar";

答案 1 :(得分:1)

您忘了在功能上引用它以便更改值。您通过值/只读传递给函数。 ref关键字仅供参考,表示通过It的地址传递对象,允许您编辑和/或更改函数内部的对象。

void CheckPointExpired(ref MPoint point)
  {
     if (point.PointUsed >= point.MaxResuse)
     {
        int lvl = point.Level;
        int maxLB = point.MaxLookBack;
        int maxReuse = point.MaxResuse;
        int order = point.Order;            

        point = null;
        point = new MPoint(maxReuse, maxLB, lvl, order);
     }
  }

您还需要将地址传递给函数,否则该函数将无法从您的对象中读取地址。

public MPoint RunPoint(MPoint point)
  {
      // first check if point has expired
      CheckPointExpired(ref point)

      // rest of my code
  }