1

コードの Forte Sender.exe で「System.StackOverflowException タイプの未処理の例外が発生しました」というエラーが表示されます。これは私のコードに無限ループがあることを意味すると理解していますが、このループを見つけることができないようです。これが私のコードです:

フォーム1:

public partial class MainBox : Form
{
    //Making a name for the ApplicationProperties form. It can be opened when called.
    ApplicationProperties ApplicationPropertiesWindow = new ApplicationProperties();
    //All of the functions for form1 below.

フォーム2:

public partial class ApplicationProperties : Form
{
    MainBox MainBoxWindow = new MainBox();
    //All of the funcitons for form2 below.

そのため、を取り出すMainBox MainBoxWindow = new MainBox();と、プログラムが正しく実行されることに気付きました。しかし、Form1 で関数を呼び出すには、そのインスタンスが必要です。どうすればこの問題を回避できますか? 関数を別の方法で呼び出すか、無限ループを解決してください。

4

4 に答える 4

6

あなたMainBoxが を作成しApplicationProperties、それが を作成し、それが を作成しMainBox、それが を作成し、というApplicationPropertiesように無限に続きます。明らかに、このサイクルを断ち切る必要があります。

new MainBox()あなたのコードが現在立っているので、おそらくプロパティフォームのを削除し、後でそれを挿入したいと思うでしょう。次に例を示します。

ApplicationProperties ApplicationPropertiesWindow = new ApplicationProperties();
ApplicationPropertiesWindow.MainBoxWindow = this;

public partial class ApplicationProperties : Form
{
    public MainBox MainBoxWindow { get; set; }
}
于 2013-07-29T21:44:04.690 に答える
2

あなたはMainBox 内部ApplicationPropertiesで作成しており、このApplicationProperties内部でMainBoxインスタンスを作成し続けますStackOverFlowException

これを回避するには、OnLoadオーバーライドされたメソッドでインスタンスを作成できますが、相互に関連付けられたインスタンスを作成しても意味がありません。同じ参照を使用するつもりでしたか?

于 2013-07-29T21:44:58.860 に答える
2

1 つのフォームを開くだけで、そのコンストラクターから別のフォームが開き、最初のフォームが t のコンストラクターで再び開かれます...

インスタンスの作成時にコンストラクターの直前に実行されるフィールド初期化子。

于 2013-07-29T21:44:18.577 に答える
2

クラスApplicationPropertiesMainBoxオブジェクトMainBoxを作成し、オブジェクトがオブジェクトを作成しApplicationPropertiesます。これがループです。への各呼び出しnewは、そのループ内の別のコンストラクター呼び出しです。コンストラクターは、相互再帰と呼ばれる用語で相互に呼び出します。これにより、スタック オーバーフローが発生します。

于 2013-07-29T21:44:41.290 に答える