用作方法中的参数时,全局变量不会更改。它保持不变。我希望它可以相应地更改为方法算法。
//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
}
答案 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
}
我建议您研究“按价值调用”和“按引用调用”。
我希望它会有所帮助。
谢谢。 :)