繁体   English   中英

无法在方法C#中更改变量

[英]Can't change variable in method C#

好的,所以我试图制作这款小型的主机游戏,并且使用的是我为敌人和玩家指定position的类。 position包含xy值。 要移动,我正在制作一种方法-首先,我只为玩家制作了它,但是现在,我正在尝试使其适用于每个位置。

    public static void move2(int x, int y, position pos)
    {
        position newpos = new position()
        {
            X = pos.X + x,
            Y = pos.Y + y
        };
        if (possiblemove(newpos))
        {
            pos = newpos;
            Console.WriteLine("    " + pos.X +" "+ pos.Y + "<old pos - new pos >" + newpos.X +" " + newpos.Y);
            Console.ReadLine();

问题是,当我尝试将pos设置为newpos ,它没有改变,并保持与以前相同的值。 即使我写了pos = newpos ,写行也给了我2个不同的值。 如果我使用某个位置(例如playerpos ,那么如果使用变量,它就可以正常工作。

我对编程很陌生,不知道为什么会这样。

如果有解决方法,我欢迎您提出建议,这就是为什么我首先将其发布在这里的原因。

当您将引用类型传递给不带ref关键字的方法时,该方法可以修改您的对象(例如,在传递的列表中添加或删除项目),但不能将其重新分配给另一个对象。

这意味着在方法调用之前和之后,调用者将始终访问相同的对象(甚至由方法修改)。
正如Tim所提到的,添加ref关键字可以更改此内容,因此引用也可以更改。

pos不能通过引用传递,因此将其设置为新值只会更改move2的本地引用。 考虑改为通过引用传递它:

public static void move2(int x, int y, ref posistion pos)

您也必须将ref添加到您的调用代码中

我认为重构代码以实现所追求的目标的最简单方法可能是替换以下行:

pos = newpos;

像这样:

pos.X = newpos.X;
pos.Y = newpos.Y;

您可以发布Position类/结构的定义吗? 我只是按原样写出了您的代码,它对我来说像预期的那样工作。

如果您奇怪地声明了原始变量,那么在调用Move方法的位置附近查看代码也可能会有所帮助。

namespace PositionTest
{
    class Program
    {
        static void Main(string[] args) {
            Position mobpos = new Position { X = 1, Y = 2 };
            move(1, 4, mobpos);
        }

        public static void move(int x, int y, Position pos) {
            Position newpos = new Position { X = pos.X + x, Y = pos.Y + y };

            pos = newpos;
            Console.WriteLine("    " + pos.X + " " + pos.Y + "<old pos - new pos >" + newpos.X + " " + newpos.Y);
            Console.ReadLine();
        }

    }

    class Position
    {
        public int X { get; set; }
        public int Y { get; set; }
    }
}

Output:     2 6<old pos - new pos >2 6

编辑:从您的评论之一,我看到您声明位置的X和Y属性为静态。 删除static关键字,您的程序可能会运行。

因为您的X / Y类是静态属性,如您对Tim的答案的评论所述,所以所有posistion实例将共享相同的X和Y值。请考虑以下事项:

posistion posA = new posistion
{
    X = 1,
    Y = 2
};

posistion posB = new posistion
{
    X = 3,
    Y = 4
};

Console.Writeline($"{posA.X}/{posA.Y} - {posB.X}/{posB.Y}")

您期望输出是什么? 好吧,从直觉上讲, 应该1/2 - 3/4对吧? 但是,如果这是您对posistion的定义:

public class posistion
{
    public static X { get; set; }
    public static Y { get; set; }
} 

不是您从第一段代码中观察到的行为。 发生的情况是,您创建了第一个实例,其属性为12 但是,当您创建第二个实例时,它与其他所有实例共享相同的属性,因为这些属性是static ...因此,它将覆盖其他每个实例化的posistion (因为它们都共享相同的属性)。

尝试从X的定义中删除static关键字,然后看看会发生什么。 每个实例将具有不同的 X

那么代码中发生了什么? 您正在使用新值创建newPos ...,这些值将覆盖 pos的值,从而使每个值彼此之间无法区分。

此处的正确解决方法是:a)了解static工作原理,以及b)删除static关键字。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM