不要轻信自己的眼睛

今天,技术群里人问了个问题:代码中key = value; 这句要怎么改?
 

C#代码
  1. abstract class IAAA   
  2. {   
  3.     public abstract byte[] key   
  4.     {   
  5.         get;   
  6.         set;   
  7.     }   
  8. }   
  9.   
  10. class BBB : IAAA   
  11. {  
  12.    #region IAAA 成员   
  13.     public BBB(byte[] a)   
  14.     {   
  15.         key = a;   
  16.     }   
  17.     public override byte[] key   
  18.     {   
  19.         get  
  20.         {    
  21.             return key;    
  22.         }   
  23.         set  
  24.         {   
  25.             key = value;   
  26.         }   
  27.     }  
  28.     #endregion   
  29. }   

乍一看,没错啊,哪错了,要改啥?群里面几个人纷纷冒出来说没错,我也想没错啊,看看再说。

提问者接着说:赋值出错了,抛异常!

我又看了一遍,还是觉得没问题。为了验证,我马上打开VS,验证了一下,发现在key = value处出现堆栈溢出错误!哦,我恍然大悟,这个属性封装了自身,调用set后就变成嵌套赋值,不断迭代,自然出现堆栈溢出。随即给出解决方法,类BBB作如下修改即可:
 

C#代码
  1. class BBB : IAAA   
  2. {  
  3.     #region IAAA 成员   
  4.     public BBB(byte[] a)   
  5.     {   
  6.         _key = a;   
  7.     }   
  8.     private byte[] _key;   
  9.     public override byte[] key   
  10.     {   
  11.         get  
  12.         {    
  13.             return _key;    
  14.         }   
  15.         set  
  16.         {   
  17.             _key = value;   
  18.         }   
  19.     }  
  20.     #endregion   
  21. }  

有些问题光靠眼睛很难看出来的,动手调试一下,就可以发现问题了。要勤于动手,不要被自己的眼睛欺骗了!