我正在使用递归来计算两个变量。当我从方法中将一个变量定义为成员变量时,让我感到困惑的是,它返回最后分配给变量的值而不是第一个分配给变量的值?为什么会这样?
class Program
{
int a = 3;
static void Main(string[] args)
{
Program program = new Program();
int result = program.Test();
Console.WriteLine(result); // result = 0
Console.ReadKey();
}
private int Test()
{
a--;
if(a != 0)
{
Test();
}
return a;
}
}
class Program
{
static void Main(string[] args)
{
Program program = new Program();
int result = program.Test(3);
Console.WriteLine(result); // result = 2
Console.ReadKey();
}
private int Test(int a)
{
a--;
if(a != 0)
{
Test();
}
return a;
}
}
我想知道这是怎么发生的?还有其他规则会影响递归返回顺序吗?对我来说,我认为如果不使用out或ref,则应复制该成员变量以进行计算。那么有人可以帮助我找到原因吗? 非常感谢。
答案 0 :(得分:1)
这可以按预期工作:
private int Test(int a){
a--;
if (a != 0)
return Test(a);
return a;
}
如果不返回测试结果,它将仅运行该方法,然后转到该方法的下一条语句。在您的情况下,如果没有return Test(a)
,它将不会对Test(int a)的结果产生任何影响。
编辑:
通过引用传递具有相似工作代码的示例
static void Main(string[] args)
{
Program program = new Program();
int a = 3;
int result = program.Test(ref a);
Console.WriteLine(result); // result = 0
Console.ReadKey();
}
private int Test(ref int a)
{
a--;
if (a != 0)
{
Test(ref a);
}
return a;
}
答案 1 :(得分:0)
a
的值由Test()
更改。每次Test
的调用都使用相同的变量a
。
如果要复制,请自己制作:
private int Test()
{
int b = a--;
if(a != 0)
{
Test();
}
return b;
}
答案 2 :(得分:0)
省略了this
关键字,这使成员变量看起来像普通的局部变量,但是它们在原理上有所不同。成员变量引用相同的实例。
private int Test()
{
this.a--;
if(this.a != 0)
{
this.Test();
}
return this.a;
}