1、代码如下:
namespace 验证PreRenderRecursiveInternal
{
class Program
{
static void Main(string[] args)
{
B b = new B();
b.s = "ssss";
b.SayHello();
Console.ReadKey();
}
}
public class B
{
public string s;
public void SayHello()
{
Console.WriteLine("Hello");
if (s != null)
{
SayHello();
}
}
}
public class D : B
{
}
}
2、结果: a、上述程序输出的结果是:不断的输出“Hello”,直到栈溢出为止,因为创建B对象后就初始化变量s。当第一次调用SayHello 时,s不为null,当在SayHello 中在调用
SayHello ,而此时s还是不为null,就这样形成了递归调用,但函数却不返回,一致会向栈中压入当前调用的地址, 直到栈溢出为止 。
b、将 SayHello(); 换成new D().SayHello();时,就输出两个Hello,因为创建B对象后就初始化变量s。当第一次调用 SayHello 时,s不为null ,所以输出Hello;当在
SayHello中执行 new D().SayHello(); 时,输出Hello ,由于创建D对象,而D继承于B,所以又创建了B对象,而此时B对象的s变量未初始化,所以为null,因此
new D().SayHello(); 不会再被调用,函数返回,程序结束。