当我使用参数时我无法添加到一个值,但它在不在函数中时工作正常

I can't add to a value when i use parameter, but it works fine when not in the function

所以当我尝试在函数中 += 1 时,值不会更新,但我可以在没有参数的情况下更新值。

请帮忙。

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

非常感谢!

Intvalue 类型,所以它的值是 copied (与它的引用相反)到函数参数和任何该参数的修改是 local

为了传递 intreference,您应该使用 ref 关键字。

尝试关注

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

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

考虑使用 return 值、outref 以获得所需的结果。

这是official documentation关于在 C# 中将参数传递给方法的内容,这有助于解释问题

令人惊讶的是这里有多少答案是完全错误的。他们都在谈论 int 是一种值类型,而这些信息在这里完全不相关。

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

不知何故,答案似乎混淆了 amountofstocks =+ 1 与变异的值类型,这完全是错误的!这里唯一发生的事情是变量 amountofstock 分配了一个新值 并且因为参数是按值传递的(c# 中的默认行为)赋值有在调用站点没有任何影响(分配是在 copy 上进行的)。

如果 amountofstock 是引用类型 ,则会发生完全相同的事情。如果 amountofstring 成为 string,那么您的代码行为将完全没有变化。

长话短说,您看到的行为是由于 c# 中的参数默认情况下按值传递,即句点。在这种特殊情况下,它与 amountofstock 是值类型无关。

如果您需要重新分配一个参数的值并让它在调用站点持久化,那么您需要通过引用传递它;在你的情况下 ref amountofstock 虽然在某些情况下 out 更合适。