0

我对 C# 相当陌生,并认为我会从这里的教程开始。

我已经完成了前 3 个,并且正在研究更多关于 C# 类以及可以使用它们的各种方式。然后我突然意识到我的所有代码都在一个类中(MainForm,因为我正在使用 SharpDevelop),我应该尝试更好地组织它。但是,当我尝试引用其他类中的代码时,我得到了 StackOverflowException。我已经实例化了类(例如CheckAnswers checkanswers = new checkanswers;),出了什么问题?如果需要,我可以发布代码,但我的猜测是这是一些很容易诊断的 n00b 错误。

编辑:

代码 - https://docs.google.com/open?id=0B9vVcIham8NHMGlNaDk3MTZ6ejA

有不少。这只是我自己编写的代码,不是表单配置的东西。

4

3 回答 3

3

你在这里进行相互递归。

在 MainForm 中,您在第 23 行隐式调用 CheckAnswers 构造函数(这是对非静态变量的初始化,这意味着它将在构造 MainForm 时运行)。
在 CheckAnswers 中,您以类似的方式创建一个 MainForm 实例(第 193 行)。

这将导致堆栈溢出 - MainForm 创建一个 CheckAnswers 对象,该对象创建一个 MainForm 对象,该对象创建一个 CheckAnswers 对象,该对象...

编辑:如果您需要在类之间进行双向通信(我建议在大多数情况下反对),这将不起作用。CheckAnswers 对象持有对不同实例MainForm 的引用,MainForm 的实例也是如此。这根本行不通(并且会导致无限递归)。
做你想做的事情的一种方法是将 MainForm 的实例发送到 CheckAnswers 构造函数,并在第 23 行使用“this”作为构造函数的参数并使用该参数初始化 mainform(在 CheckAnswers 中)。像这样的东西:

public partial class MainForm : Form
{
    CheckAnswers checkanswers;
    ...
    public MainForm()
    {
        checkanswers = new CheckAnswers(this);
        ...
    }
}
public class CheckAnswers // Not sure why you inherit MainForm here, but it's not a good idea, as someone already stated
{
    MainForm mainform;

    public CheckAnswers (MainForm main)
    {
        mainform = main;
    }
    ...
}
于 2012-12-24T09:22:02.390 回答
1

CheckAnswers 类派生自 MainForm 类。因此,当您调用 CheckAnswers 类的构造函数时,它会使用基类 (MainForm) 的所有内部成员创建此类的实例。这就是为什么再次调用这行代码的原因:

第 23 行:CheckAnswers checkanswers = new CheckAnswers();

再一次,实例被创建,这行代码被一次又一次地递归调用,直到发生 StackOverflow 异常。

基本上,此代码代表与您的代码相同的问题:

class BaseClass
{
    DerivedClass myObject = new DerivedClass(); // this is a recursive call
}

class DerivedClass : BaseClass
{   
}
于 2012-12-24T09:21:13.257 回答
0

要进行通信,您应该将现有对象的实例作为参数传递,而不是每次都创建一个新对象(否则具体对象之间将无法进行通信)。

所以这里有一个例子,它代表了你需要做什么的想法:

public class CheckAnswers
{
    MainForm mainform;
    public CheckAnswers (MainForm  form)
    { 
        this.mainform = form;
    }

   ...
}

在 MainForm 类中,您必须将“自身”作为参数传递给 CheckAnswers 的构造函数,如下所示:

CheckAnswers checkanswers = new CheckAnswers(this);
于 2012-12-24T09:36:54.393 回答