gpt4 book ai didi

c# - 重新初始化一个不工作的对象

转载 作者:行者123 更新时间:2023-11-30 14:54:57 26 4
gpt4 key购买 nike

我在将对象“重置”回某些默认值时遇到了一些问题。

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

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

据我所知,当我将点对象传递给 CheckPointExpired 方法时,它是作为引用传递的,所以对对象的任何更改都应该反射(reflect)在 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);
}
}

最佳答案

您需要使用 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 参数实际上是原始引用的副本。例如:

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

这里赋值 bar = foo 复制 foo 对 bar 的引用。所以有两个不同的引用指向相同的位置。无论何时用另一个值初始化 bar,它都会丢弃旧的引用并且不会'影响foo:

bar = "bar";

关于c# - 重新初始化一个不工作的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26562202/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com