当我使用参数时,我无法添加值,但是当它不在函数中时它可以正常工作

时间:2018-01-28 17:28:15

标签: c# unity3d unity5

所以当我在函数中尝试 + = 1 时,值为doesent update,但我可以更新没有参数的值。

请帮忙。

public void buystock(int amountofstocks, int stockvalue)
{
    int stocksbuy = 400;
    if (amountofstocks >= 40)
    {
        if (GetComponent<Money>().MoneyValue >= (stockvalue + stocksbuy))
        {
            GetComponent<Money>().MoneyValue -= stockvalue + 400;
            amountofstocks += 1;
        }
    }
    else
    {
        if (GetComponent<Money>().MoneyValue >= (stockvalue + 10))
        {
            GetComponent<Money>().MoneyValue -= stockvalue + 10;
        }
    }
}

和我的另一个是:

public void buyoil1()
{
    buystock(oil1amountofstocks, oil1value);
}

非常感谢!

3 个答案:

答案 0 :(得分:2)

Int类型,因此它的值被复制(与它的引用相反)到函数参数和任何对该参数的修改是本地

要传递int参考,您应该使用参考关键字。

尝试以下

public void buystock(ref int amountofstocks,ref int stockvalue)

答案 1 :(得分:1)

您正在将结构传递给正在复制值的方法,而不是将引用传递给变量。

考虑使用返回值outref来获得所需的结果。

这是关于向C#中的方法传递参数的official documentation,它有助于解释问题

答案 2 :(得分:-2)

令人惊讶的是,这里有多少答案是完全错误的。他们都继续int作为一种价值类型,而这些信息在这里完全无关紧要。

int是一个不可变的类型,你不能改变它,这是在这个问题的上下文中值类型可能相关的唯一原因。

不知何故,答案似乎是将amountofstocks =+ 1与变异值类型混合在一起,这只是假的!这里唯一发生的事情是变量amountofstock分配了一个新值,并且因为参数是通过值传递的(c#中的默认行为),所以赋值没有任何影响回到呼叫站点(分配在副本上进行)。

如果amountofstock是引用类型,则会发生同样的事情。如果amountofstringstring,则代码的行为根本不会发生任何变化。

简而言之,您所看到的行为是由于c#中的参数默认情况下是按值,期间传递的。在这种特殊情况下,它无关,amountofstock是值类型。

如果您需要重新分配参数的值并将其保留在呼叫站点,那么您需要通过引用传递它;在您的情况下ref amountofstock虽然在某些情况下out更合适。