1

我目前正在玩一些 XNA 的东西来学习编程 AI。无论如何,这是我的情况:A 类有一个函数,它引用 B 类的一个实例,对它做一些事情,然后返回它。B 类包含 A 类的一个实例,然后从中调用函数。

代码示例:

Class A
{
    B classB;

    public A()
    {
        classB = new B();
    }

    public void Act()
    {
        this = B.Do(ref this);
    }
}

Class B
{
    public A Do(ref A classA)
    {
        //Manipulate
        return classA;
    }
}

我试过传递一个成员克隆..但这显然不起作用,因为“this”是只读的。我对此一无所知。我真的被困住了。有人有什么想法吗?理想情况下,我希望避免将对象中的每个变量都作为单独的参数传递,真的。

安迪。

4

8 回答 8

2

类是引用类型,所以这样做

Class B
{
    public void Do(A classA)
    {
        //Manipulate
    }
}

应该操作对象 classA 的引用。然后在 A 中,

Class A
{
    B classB;

    public A()
    {
        classB = new B();
    }

    public void Act()
    {
        B.Do(this);
    }
}

注意:“这确实有副作用,您传递的 A 的引用不能设置为 null(它只会将局部变量设置为 null)” - JulianR

于 2009-04-18T19:10:35.740 回答
1

您的 B.Do() 方法通过使用 ref 和返回来执行它(修改 A)双倍。也不需要修改classA。而且因为您的目标this是它无论如何都行不通。您永远不会分配给this,这没有任何意义。

所以简单的答案是

class B
{
   void Do(A anA) { anA.PublicProp = 1; }
}

但是循环引用确实使它成为一个可疑的设计。

于 2009-04-18T19:01:05.733 回答
0

//Manipulate 中是否有特定内容要求您将类引用作为 ref 传递?为什么你还要返回 classA - 如果你开始使用 ref ,这似乎是多余的。

于 2009-04-18T18:57:15.290 回答
0

只需删除 ref 关键字。如果您想将参数更改为其他内容,则只需要 ref,如果您只想操纵它,请不要使用 ref。

我认为如果语言允许您将其更改为那样会很糟糕(难以理解),因此它不允许您尝试过。

于 2009-04-18T19:00:21.630 回答
0

您不能将“ref”与“this”一起使用。为什么需要通过引用传递参数?

如果您的函数必须更改调用者所引用的对象,您只需要一个“ref”参数。如果您只需要操作和/或更改参数的字段,那么您不需要 ref 参数。

于 2009-04-18T19:01:00.070 回答
0

为了更清楚起见,整个事情都是针对简单 AI 的行为(例如追逐、守卫、逃避等)。我想将整个 AI 实体传递给行为,以便我可以将所有实体的行为分开(有点像多个网页的单个样式表)。我想传递整个对象的原因是某些行为需要对象的某些部分,而有些则不需要。

至于我为什么要回来……我不太清楚我是怎么做出这个决定的。我会删除它

于 2009-04-18T19:05:01.590 回答
0

非常感谢,德里克 E!

我刚刚测试了你说的,效果很好。

我认为,我的问题是我在想,当我传递参数时,它会克隆它并对其进行操作,就像(我认为..)它在 PHP 或 VB 中所做的那样(不记得我被告知它在)

于 2009-04-18T19:13:39.493 回答
0

对象总是通过引用而不是值传递。这就是我们将 C# 中的类称为引用类型的原因。如果您使用结构,请小心,因为它们是值类型。将传递结构的副本而不是原始结构。如果您希望传递原始内容,则必须添加ref关键字。ref仅在您希望用对另一个对象的引用替换对一个对象的引用时对对象有用。

于 2009-06-28T17:24:14.523 回答