【问题标题】:Unnecessary assignment of a value to 'player"为“玩家”分配了不必要的值
【发布时间】:2020-11-16 11:56:45
【问题描述】:

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

//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;
}

我希望能够调用此函数并输入活跃玩家 (player) 并将其值增加 (cent_v)。然而,玩家 = 玩家 + cent_v;正在说“给'玩家'分配了不必要的价值”,我不明白为什么。硬编码是不可能的,因为这取决于谁是活跃玩家。

【问题讨论】:

  • player 在方法范围内定义。使用 ref/out(今天不太记得 C# lang..)
  • int 是一种值类型,这意味着playeradd_cents_player 方法范围之外将保持不变。

标签: c# function unity3d variables variable-assignment


【解决方案1】:

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

    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;
    }

【讨论】:

    【解决方案2】:

    int 类型。它是按值传递的,这意味着player 实际上是player_1副本。如果您随后更改方法中的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 的值实际上增加了

    【讨论】:

    • 感谢大家的快速响应。 #derHugo 解释 ref 的文档链接确实很有帮助。谢谢
    【解决方案3】:

    有两种方法可以将变量传递给函数。 1 是通过引用,这意味着您将对变量的引用传递给函数。这就是 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
    
    ...
    
    
    

    这就是编译器所抱怨的;您正在向函数中的本地参数添加一个值。但是由于您不返回此值,或者在某些时候读取该值,编译器就像'嘿,这段代码什么都不做,因此最好删除它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-09-06
      • 1970-01-01
      • 2020-12-22
      • 2017-09-14
      • 1970-01-01
      • 2022-11-25
      • 1970-01-01
      相关资源
      最近更新 更多