传递“this”作为参数 - C#

时间:2009-04-18 18:52:37

标签: c# xna

我正在玩一些学习编程AI的XNA东西。无论如何,这是我的情况: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”是只读的。我不知道这个。我真的被卡住了。有人有什么想法吗?理想情况下,我希望避免将对象中的每个变量作为单独的参数传递,实际上。

安迪。

8 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

你的B.Do()方法通过使用ref和return来完成它(修改A)。也不需要修改classA。而且因为你定位this它无论如何都不会起作用。你永远不会分配给this,这没有任何意义。

所以简单的答案是

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

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

答案 2 :(得分:0)

// Manipulate中是否有特定的内容需要您将类引用作为ref传递?你为什么还要返回classA-如果你使用ref开头,那似乎是不情愿的。

答案 3 :(得分:0)

只需删除ref关键字即可。如果你想把参数改成其他东西,你只需要参考,如果你只是想操纵它,不要使用参考。

我认为如果语言允许你将其改为,那就太糟糕了(很难理解),所以它不允许你尝试过。

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

为了更加清晰,整个事情是针对简单AI(EG追逐,守卫,逃避等)的行为。我想将整个AI实体传递给行为,以便我可以将所有实体的行为分开(类似于多个网页的单个样式表)。我想传递整个对象的原因是某些行为需要对象的某些部分而有些则不需要。

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

答案 6 :(得分:0)

非常感谢,Derek E!

我刚刚测试了你所说的内容,它运行良好。

我的问题是,我认为,当我通过论证时,它会对其进行克隆并对其进行操作,就像(我认为......)它在PHP或VB中一样(不记得哪个)那些我被告知它的确在那里)

答案 7 :(得分:0)

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