为何将全局变量作为方法参数传入后,方法无法修改其值?
问题分析与解决方案
你碰到的是C#中值类型参数传递的典型问题,咱们一步步拆解清楚:
为什么全局变量没被修改?
你的globalBill是float类型,属于C#里的值类型。当把值类型变量作为参数传入方法时,默认是传值传递——也就是说,方法里的bill参数只是原全局变量的一个副本,你在方法里对bill做的+=5操作,只会修改这个局部副本,完全不会影响到外面的globalBill本身。这就是为什么方法内输出5,但全局变量还是初始值0的核心原因。
三种可行的解决方案
方案1:使用ref关键字传递引用
通过ref关键字,我们可以把变量的引用传递给方法,这样方法里修改的就是原变量本身了:
float globalBill; public Form1() { InitializeComponent(); saveGlobalBill(ref globalBill); // 调用时添加ref Console.WriteLine("Global bill now = " + globalBill); // 现在会输出5 } public void saveGlobalBill(ref float bill) { // 参数前添加ref bill += 5; Console.WriteLine("In method bill is " + bill); // 输出5 }
方案2:直接操作全局变量
既然globalBill已经是全局变量了,完全没必要再把它作为参数传入方法,直接在方法里修改它就行:
float globalBill; public Form1() { InitializeComponent(); saveGlobalBill(); Console.WriteLine("Global bill now = " + globalBill); // 输出5 } public void saveGlobalBill() { globalBill += 5; // 直接操作全局变量 Console.WriteLine("In method bill is " + globalBill); // 输出5 }
方案3:让方法返回修改后的值
把方法改成返回修改后的数值,再赋值给全局变量:
float globalBill; public Form1() { InitializeComponent(); globalBill = saveGlobalBill(globalBill); Console.WriteLine("Global bill now = " + globalBill); // 输出5 } public float saveGlobalBill(float bill) { // 修改返回类型为float bill += 5; Console.WriteLine("In method bill is " + bill); // 输出5 return bill; }
补充说明
C#里的类型分为值类型(如int、float、struct、枚举等)和引用类型(如class、数组、委托等)。值类型默认传值,副本修改不影响原变量;引用类型默认传递的是对象的引用(但这个引用本身也是值传递,不过因为指向同一个对象,所以修改对象的内容会影响原对象)。如果需要修改值类型的原变量,就可以用上面的几种方式。
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

