C#函数调用后变量值未更新问题咨询
问题原因:C#的值类型值传递机制
这是因为C#中值类型参数默认采用值传递,具体分析如下:
值传递的本质
调用Plus(a, n)时,传递的是外部变量a和n的副本,而非变量本身。函数内部修改的只是这个副本的值,和外部原始变量没有关联,函数执行完毕后副本会被销毁,原始变量自然不会变化。结合代码分析
你定义的int a属于值类型,调用Plus(a, n)时会创建a的副本传入函数。Plus内部对形参a的累加操作,全是在这个副本上进行的,完全不影响外部的原始a变量。
两种常用解决方法
方法一:用ref关键字实现引用传递
让形参指向原始变量的引用,内部修改会直接作用于原始变量:
static void Plus(ref int a, int n) { for(int i = 0; i < n; i++) { a = a + 1; } } static void Main(string[] args) { Console.WriteLine("a = "); int a = int.Parse(Console.ReadLine()); Console.WriteLine("n = "); int n = int.Parse(Console.ReadLine()); Plus(ref a, n); // 调用时必须加ref关键字 Console.WriteLine($"after plus a = {a}"); }
方法二:让函数返回修改后的值
通过返回值将计算结果传递出来,再赋值给外部变量:
static int Plus(int a, int n) { for(int i = 0; i < n; i++) { a = a + 1; } return a; } static void Main(string[] args) { Console.WriteLine("a = "); int a = int.Parse(Console.ReadLine()); Console.WriteLine("n = "); int n = int.Parse(Console.ReadLine()); a = Plus(a, n); // 接收返回值并覆盖原始变量 Console.WriteLine($"after plus a = {a}"); }
内容的提问来源于stack exchange,提问作者Bách Trần
相关产品推荐
相关产品推荐

