可怕的无穷递归

今天在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是很难发现的!

测试的同志们一定要多加注意啊!

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值