通行证;这";作为参数-C#

通行证;这";作为参数-C#,c#,xna,C#,Xna,我现在正在玩一些XNA的东西,学习编程AI。无论如何,我的情况是这样的:类A有一个函数,它引用类B的一个实例,对它执行一些操作,然后返回它。类B包含类A的一个实例,然后从中调用函数 代码中的示例: Class A { B classB; public A() { classB = new B(); } public void Act() { this = B.Do(ref this); } } Clas

我现在正在玩一些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”是只读的。我对此一无所知。我真的卡住了。有人有什么想法吗?理想情况下,我希望避免将对象中的每个变量作为单独的参数传递,真的


Andy。

在//Operate中是否有特定的东西要求您将类引用作为ref传递?为什么还要返回classA呢?如果您使用ref开头,那么这似乎是多余的。

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

我认为如果语言允许你把这个改成那个会很糟糕(很难理解),所以它不允许你尝试过的东西。

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

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

您的B.do()方法使用ref和return来(修改a)double。这两者都不需要修改classA。因为你的目标是
这个
,所以它无论如何都不会起作用。您从未分配给
,这毫无意义

所以简单的答案是

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

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

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


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

类是引用类型,这样做

Class B
{
    public void Do(A classA)
    {
        //Manipulate
    }
}
应该操作对象classA引用。然后在一个

Class A
{
    B classB;

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

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

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

非常感谢您,Derek E

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


我想,我的问题是,我在想,当我传递这个参数时,它克隆了它,并对它进行了操作,就像(我想…)它在PHP或VB中所做的那样(我记不起我被告知是在哪个参数中做的)

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

整个过程都是针对简单AI的行为(例如追逐、守卫、逃避等)。我想将整个AI实体传递给行为,这样我就可以将所有实体的行为分开(有点像一个样式表对应多个样式表)。我想传递整个对象的原因是,有些行为需要对象的某些部分,有些则不需要,这就是我返回的原因。。我不太清楚我是怎么做出那个决定的。我将删除它。多页的单样式表,而不是!这确实有一个副作用,即您传递的引用不能设置为null(它只会将局部变量设置为null),这可能是它需要ref参数的原始原因。这是一个很好的观点。我不认为这是OP的意图(事实并非如此),但它可能是。我将编辑以指出这一点。