今天在http://www.dotnetperls.com/algorithm看到一段代码,闲着没事就敲了下来运行一下,
static void Main(string[] args)
{
A(0);
}
static void A(int a)
{
Console.WriteLine(a);
if (true)
{
A(++a);//Recurse
}
}
不知道哪里来的想法将if(a<5)改为了if(true),完事之后编译--运行了一下,是的,出现了下面的情况,抛出了Process is terminated due to StackOverflowException.
这使我突然想起了前几天在《Visual C#2010 从入门到精通》上看到的一段话,这里摘抄下来,以示警告,也顺带用正规的语言解释一下上面的问题。
"虽然大家习以为常的一种做法是为属性和private字段赋予几乎完全相同的名称,两个名称只是首字母的大小写有别,但应该关注这样做的一个缺陷。请看以下代码,它实现了一个名为Employee(员工)的类。employeeID字段是一个private字段,但EmployeeID属性提供了对这个字段的public访问:
class Employee
{
private int employeeID;
public int EmployeeID;(书本上多了这个分号,请各位认真些)
{
get { return this.EmployeeID; }
set { this.EmployeeID = value; }
}
上述代码能成功通过编译(这是不可能的,呵呵),但一旦访问EmployeeID属性,程序就会抛出一个StackOverflowException异常。这是由于get accessor和set accessor引用的是属性(大写的E)而不是private字段(小写的e),所以会造成一个无穷递归,最终造成进程耗尽所有可用的内存。这种因为一个字母的大小写而引发的bug是很难发现的!”
测试的同志们一定要多加注意啊!