不必要地为“玩家”赋值

Unnecessary assignment of a value to 'player"

我在函数中赋值时遇到问题。这是我的代码

//Player cents
private int add_cents = 3;
public int player_1, enemy_1, enemy_2, enemy_3;


    public void players_ready()
{
    add_cents_player(player_1, add_cents);
}

public void add_cents_player(int player, int cent_v)
{
    player = player + cent_v;
}

我希望能够调用此函数并输入任何活跃玩家(玩家)并将其值增加 (cent_v)。但是,player = player + cent_v;说的是“不必要地为‘玩家’赋值”,我不明白为什么。硬编码是不可能的,因为它取决于谁是活跃玩家。

一种选择是更改方法 return 类型:

    private int add_cents = 3;
    public int player_1, enemy_1, enemy_2, enemy_3;

    public void players_ready()
    {
        player_1 = add_cents_player(player_1, add_cents);
    }
    public int add_cents_player(int player, int cent_v)
    {
        return player + cent_v;
    }

intvalue 类型。它是按值传递的,这意味着 player 实际上是 player_1copy。如果您随后更改方法中的 player,这不会以任何方式影响 player_1,因为它 没有引用 并且它们之间没有关系。

看起来您想要做的是使用 ref 以“强制”通过引用传递值

public void players_ready()
{
    add_cents_player(ref player_1, add_cents);
}

public void add_cents_player(ref int player, int cent_v)
{
    player += cent_v;
}

因此调用 players_ready 后值 player_1 实际上增加了

有两种方法可以将变量传递给函数。 1 是 by reference,这意味着您将对变量的引用传递给函数。这就是 object 类型的变量所发生的情况 - 不是整个对象的内存都被复制并提供给函数,而只是该对象所在的内存块的地址。

对于intfloat等,这是不同的。这些值 由值 传递。

另见 relevant msdn docs

这两个选项之间存在根本区别:引用类型通过引用传递并且可以更改,并且原始对象也会更改。例如。这有效:


class MySimpleObject // an object is a reference type
{
   public int someValueType; // int is a value type
}

...

var x = new MySimpleObject();
myFunc(x); // increment x.someValueType by 5


这不计入按值传递的对象,这是作为值类型的 int 所发生的情况。因此你的函数什么都不做,因为它只是操纵局部值,没有传递引用。


var player_1 = 5;
add_cents_player(player_1, 15); 
// Player_1 is still 5
add_cents_player(player_1, 15); 
// Player_1 is still 5

...


这就是编译器所抱怨的;您正在向函数中的局部参数添加一个值。但是因为你没有 return 这个,或者在某个时候读取值,编译器就像'嘿这段代码什么都不做,因此最好删除它。