C# 我可以引用变量而不是变量的实例吗?

C# 我可以引用变量而不是变量的实例吗?,c#,C#,我有以下两门课: class MoveTo : Routine { Creature creature; Entity target; public MoveTo(Creature Creature, Entity Target) { this.creature = Creature; this.target = Target; } public Act() { creature.Move

我有以下两门课:

class MoveTo : Routine
{
    Creature creature;
    Entity target;

    public MoveTo(Creature Creature, Entity Target)
    {
        this.creature = Creature;
        this.target = Target;
    }

    public Act()
    {
        creature.MoveTowards(Target);
    }
}
。。。而且

class Creature
{
    Entity ClosestTarget { get; set; } 
    Routine currentBehavior;
    //...
}
我想要实现的是:

creature.ClosestTarget = OldClosestTarget;
Routine moveToClosestTarget = new MoveTo(creature, creature.ClosestTarget); //pass "ClosestTarget" as the "Target" parameter

//...

moveToClosestTarget.Act(); //Move towards OldClosestTarget
creature.ClosestTarget = NewClosestTarget;
moveToClosestTarget.Act(); //What I want: Move towards NewClosestTarget. What it actually does: Move towards OldClosestTarget
MoveTo例程中的引用对象将与OldClosestTarget保持一致,它也应该保持一致

但是对于这个特定的用例,我需要它做相反的事情:我想专门传递对bioture.ClosestTarget变量的引用,而不是对它当前包含的实例的引用

我能用C#实现这一点吗


给定您的代码,您可以仅使用
生物
对象初始化,并使用其
最接近的目标
。虽然如果你正在使用
生物
中的
移动
方法,为什么还要费心通过
目标
?您可以使用该
生物的
最接近目标
,对象本身

几乎不需要更改代码:

class MoveTo : Routine
{
    Creature creature;
    Func<Entity> target;

    public MoveTo(Creature Creature, Func<Entity> Target)
    {
        this.creature = Creature;
        this.target = Target;
    }

    public Act()
    {
        creature.MoveTowards(Target());
    }
}
这是lambda演算中的经典惰性计算


另一种方法是定义
类间接{public T Value;}
并将
最接近的目标
实体
更改为
间接
,给
移动到
相同的
间接
引用,然后当
间接
更改时,这两个类都会看到新的值。

另一层间接寻址…它仍然只在构造函数中读取一次
ClosestTarget
。而且它使
MoveTo
类不那么通用,因为它必须始终使用
生物。ClosestTarget
。现在它至少应该工作了,同意对属性的依赖性。正如Ben所说,将目标作为一个参数是为了最大化通用性。。。UH海角?一般性?无论如何,我希望能够向MoveTo()中输入的不仅仅是最近的树。至于不只是跳过所有的恶作剧,而只是使用生物的MoveTowards()例程:我正在构建一个行为树。MoveToward()是一种单帧方法,可沿目标方向移动生物,而MoveTo()是一种多帧例程,可在成功或失败之前持续将生物移向目标,具体取决于它们是成功还是被打断。+1。小心你在lambda捕获的东西。。。如果与当前生物相关的计算目标足够常见,则最好使用
Func
并将当前生物传递给它。否则,如果
生物
变量被更改(即在循环中),您将获得非常奇怪的行为…@AlexeiLevenkov:当然,但我认为原始代码将其作为单独的构造函数参数是有原因的。。。目标并不总是与传入的生物耦合。@AlexeiLevenkov:也可以通过将委托直接绑定到实例方法而不是构建lambda来解决这个问题,例如
new MoveTo(生物,生物。GetClosestTarget)
不幸的是,没有很好的语法来引用属性的getter方法。这太完美了,谢谢!如果我们在评论中包含代表方法,有三种不同的方法可以解决我的问题:我不敢相信我竟然没有想到这三种方法。我想我会选择间接的方法:我发现自己更喜欢这样的语法,它更容易解释。非常感谢!
class MoveTo : Routine
{
    Creature creature;
    Func<Entity> target;

    public MoveTo(Creature Creature, Func<Entity> Target)
    {
        this.creature = Creature;
        this.target = Target;
    }

    public Act()
    {
        creature.MoveTowards(Target());
    }
}
new MoveTo(creature, () => creature.ClosestTarget)