问题描述
我写了个递归的方法publicvoidAnyGetString(Formform,intan){InfoInfoTemp=TempFile.Find(delegate(Infov){returnv.FormName==form.Name;});if(InfoTemp!=null){List<Info.form>formtemp=newList<Info.form>(InfoTemp.FormText);if(InfoTemp.FormName=="PmxViewEdit"){form.Font=newSystem.Drawing.Font("MSUIGothic",9f);}foreach(FieldInfofiinform.GetType().GetFields(BindingFlags.Instance|BindingFlags.NonPublic)){objecto=fi.GetValue(form);//获取字段对象if(o!=null){if(oisControl)//判断类型{if((((Control)o).Text)!="0"&&(((Control)o).Text)!=""){System.Text.RegularExpressions.Regexregex=newSystem.Text.RegularExpressions.Regex(@"^[A-Za-z0-9]+$");if(!regex.IsMatch((((Control)o).Text))){if((((Control)o).Name).ToString()==""){//temp.Add(newInfo.form("message",((Control)o).Text));//((Control)o).Text="Test";}else{//temp.Add(newInfo.form(((Control)o).Name,((Control)o).Text));Info.formtemp=formtemp.Find(delegate(Info.formv){returnv.ID==(((Control)o).Name);});if(temp!=null){if(temp.text!=""){((Control)o).Text=temp.text;}}}}}if((((Control)o).Name)=="vtCtrl"){Console.WriteLine();FieldInfo[]FI=o.GetType().GetFields(BindingFlags.Instance|BindingFlags.NonPublic);foreach(FieldInfoTEmpinFI){objectop=TEmp.GetValue(o);if(opisToolStripItem){Info.formtemp=formtemp.Find(delegate(Info.formv){returnv.ID==(((ToolStripItem)op).Name);});if(temp!=null){if(temp.text!=""){((ToolStripItem)op).Text=temp.text;}if(temp.ToolTipText!=""){((ToolStripItem)op).ToolTipText=temp.ToolTipText;}}}}}}if((oisForm)&&(an==0)){this.AnyGetString((Form)o,1);}if((oisForm)&&(an==1)){this.AnyGetString((Form)o,2);}if((oisForm)&&(an==2)){this.AnyGetString((Form)o,3);}if((oisForm)&&(an==3)){this.AnyGetString((Form)o,4);}if(oisToolStripItem){if((((ToolStripItem)o).Text)!="0"&&((ToolStripItem)o).Text!=""){Regexregex=newRegex(@"^[A-Za-z0-9]+$");if(!regex.IsMatch((((ToolStripItem)o).Text))){Info.formtemp=formtemp.Find(delegate(Info.formv){returnv.ID==(((ToolStripItem)o).Name);});if(temp!=null){if(temp.text!=""){((ToolStripItem)o).Text=temp.text;}if(temp.ToolTipText!=""){((ToolStripItem)o).ToolTipText=temp.ToolTipText;}}}}}}}}}
然后if((oisForm)&&(an==0)){this.AnyGetString((Form)o,1);}if((oisForm)&&(an==1)){this.AnyGetString((Form)o,2);}if((oisForm)&&(an==2)){this.AnyGetString((Form)o,3);}if((oisForm)&&(an==3)){this.AnyGetString((Form)o,4);}
这一段代码么,我想改成if((oisForm)&&(an<5)){an++;this.AnyGetString((Form)o,an);}
按理说这样修改后应该是等价的,但事实确不是如此,修改后的处理的次数,要远远小于没修改之前的,所以想问一下,到底是怎么回事
解决方案
解决方案二:
话说你应该看看sp1234大大的帖子"重量级查询控件"http://bbs.csdn.net/topics/310047728当然他这个要稍微改改,不过基本思想要理解了,把查询条件延后,代码就清楚的多。
解决方案三:
递归不是这样用的,你这个可以用for循环来处理之所以出现这样,是因为你的an++,是在函数外的,并不是在AnyGetString内如果改在if ((o is Form) && (an == 0))之前++的话,这个代码是可以运行的,也是你理想中的。不过你这个代码,可优化的地方还是比较多的,有一些位置我不知道是你的需求是这样,还是不刻意的,确实可以重新写。
解决方案四:
引用2楼fei2yun的回复:
递归不是这样用的,你这个可以用for循环来处理之所以出现这样,是因为你的an++,是在函数外的,并不是在AnyGetString内如果改在if ((o is Form) && (an == 0))之前++的话,这个代码是可以运行的,也是你理想中的。不过你这个代码,可优化的地方还是比较多的,有一些位置我不知道是你的需求是这样,还是不刻意的,确实可以重新写。
唔,非常感谢你的解答,不过an++不能放在if的外面,因为我需要判断(o is Form)后再进行an++这段代码是对某个程序窗口的反射,获取该窗口未知深度情况下的所有控件的text属性并进行修改由于窗口里面还嵌套的另外的窗口,所以我需要用这个判断是否遇到了另外的窗口,所以不能在外面an++,同时也不能取消这个变量,因为没了这个参数会无限制的叠加直到程序崩溃。
解决方案五:
哪里等价了?
解决方案六:
改成下面这样,似乎就等价了if((oisForm)&&(an<5)){this.AnyGetString((Form)o,(an+1));}
解决方案七:
++有时会引来灾难,少用
解决方案八:
引用5楼From_TaiWan的回复:
改成下面这样,似乎就等价了if((oisForm)&&(an<5)){this.AnyGetString((Form)o,(an+1));}
非常感谢,确实得到的结果有所改变,虽然三种方法获得的值都不一样233不过有点想知道,为啥会出现这种情况?
解决方案九:
if((oisForm)&&(an<5)){an++;this.AnyGetString((Form)o,an);}这样写,执行后an本身的值变了,而原来算法,是没有改变an的值从全部代码看,当an值不同时,就会进入不同的递归,所以an的值很“敏感”