为什么此方法不更改全局变量?

时间:2019-01-19 05:44:55

标签: c#

用作方法中的参数时,全局变量不会更改。它保持不变。我希望它可以相应地更改为方法算法。

//Test
float globalBill;

public Form1()
{
  InitializeComponent();
  saveGlobalBill(globalBill);
  Console.WriteLine("Global bill now = " + globalBill); //Console returns 0
}

public void saveGlobalBill(float bill)
{
   bill += 5;
   Console.WriteLine("In method bill is " + bill); //Console returns 5
}

4 个答案:

答案 0 :(得分:5)

首先通过引用将全局变量作为参数传递,这意味着只需在方法签名中添加ref关键字,例如

public void saveGlobalBill(ref float bill)  //<= Notice this "ref" keyword here
{
    //Your stuff here
}

然后从您的构造函数中调用此方法,例如

saveGlobalBill(ref globalBill);  //<= Notice this "ref" keyword here

问题ref关键字的作用是什么?

答案::在方法的参数列表中使用时,ref关键字指示参数是通过引用而不是通过值传递的。通过引用传递的效果是,被调用方法中对参数的任何更改都会反映在调用方法中。

这意味着您的bill浮点参数将被视为对globalBill的引用。

您可以从docs.microsoft.com阅读有关ref关键字的更多信息

答案 1 :(得分:2)

由于globalBill是原始类型,它通过值传递,因此您要更改的变量是saveGlobalBill方法局部变量,而不是全局变量(在这种情况下,至少对于所有意图和目的都是全局变量, (对于包含您的代码的类是本地的)。

由于它是全局变量,因此根本不需要将其作为参数传递。您要寻找的是以下内容:

//Test
float globalBill;

public Form1()
{
    InitializeComponent();
    saveGlobalBill();
    Console.WriteLine("Global bill now = " + globalBill); //Console returns 0
}

public void saveGlobalBill()
{
    globalBill += 5;
    Console.WriteLine("In method bill is " + globalBill); //Console returns 5
}

或者,就像其他人所说的那样,通过引用将其传递,但​​是在那种情况下,我不认为首先将其声明为全局值的意义。

答案 2 :(得分:1)

通过值方法传递参数时,如果不影响主题的值,就不能更改传递参数的值,则必须将主题作为参考参数传递。

//Test
float globalBill;
public Form1()
{
  InitializeComponent();
  saveGlobalBill(ref globalBill);
  Console.WriteLine("Global bill now = " + globalBill); //Console returns 0
}

public void saveGlobalBill(ref float bill)
{
   bill += 5;
   Console.WriteLine("In method bill is " + bill); //Console returns 5
}

答案 3 :(得分:0)

当您将浮动数据传递给参数时, 它已被复制

因此,无论您在函数中执行什么操作,离开函数时,参数传递的值都不会更改。

这是您想要做的方式。

使用ref关键字传递参数

//Test
float globalBill;

public Form1()
{
  InitializeComponent();
  saveGlobalBill(ref globalBill);
  Console.WriteLine("Global bill now = " + globalBill); //Console returns 0
}

public void saveGlobalBill(ref float bill)
{
   bill += 5;
   Console.WriteLine("In method bill is " + bill); //Console returns 5
}

我建议您研究“按价值调用”和“按引用调用”。

我希望它会有所帮助。

谢谢。 :)