我遇到了一些问题'重置'一个对象回到一些默认值。
所以我有一个名为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);
}
}
答案 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
}