Joh*_*n M 0 c# .net-3.5 winforms
我正在努力将VB6应用程序移植到C#(Winforms 3.5),同时我正在尝试将功能分解为各种类(即数据库类,数据验证类,字符串操作类).
现在,当我尝试在调试模式下运行程序时,程序暂停,然后崩溃并发生StackOverFlowException.VS 2008表明无限递归原因.
我一直试图追踪可能导致这种递归的原因,现在我唯一的假设是类初始化(我在每个类的标题(?)中做).
我的想法是这样的:
这有意义还是我应该在别处寻找?
UPDATE1(代码示例):
的MainForm
namespace john
{
public partial class frmLogin : Form
{
stringCustom sc = new sc();
Run Code Online (Sandbox Code Playgroud)
stringCustom
namespace john
{
class stringCustom
{
retrieveValues rv = new retrieveValues();
Run Code Online (Sandbox Code Playgroud)
retrieveValues
namespace john
{
class retrieveValues
{
stringCustom sc = new stringCustom();
Run Code Online (Sandbox Code Playgroud)
10次中有9次,无限递归错误是由不良属性访问器引起的:
public class BrokenClass
{
private string name;
public string Name
{
get { return name; }
set { Name = value; } // <--- Whoops
}
}
Run Code Online (Sandbox Code Playgroud)
在使用方法重载进行重大重构时,我也遇到过这种情况; 有时候,当它应该调用不同的重载方法时,你会不小心结束调用自身的方法.
无论哪种方式,您都应该能够通过查看异常的调用堆栈并检查重复模式来判断.如果你看到一个,那么你的问题就在那个循环中.
编辑 - 好吧,根据您的示例代码,您肯定在初始化程序中有无限递归.我不知道该代码应该做什么,但它永远不会终止. StringCustom立即创建RetrieveValues立即创建另一个StringCustom,依此类推.
这是循环类依赖性通常被认为是代码气味的一个原因.每当你看到ClassA依赖ClassB并ClassB依赖于ClassA那时你应该尝试重构; 例外情况是如果ClassB完全由ClassA(即内部类)拥有和管理,这显然不是这里的情况.您需要以某种方式消除其中一个依赖项.