0

こんにちは、私は C# にかなり慣れていないので、私がやろうとしていることは完全にはわかりません。

基本的に、リストに get プロパティを設定しようとしています。このリストが読み込まれると、別のリストから情報が読み取られます。方法論は次のとおりです。

親リストが空の場合は、新しいリストを作成します。それ以外の場合は、親リストの要素を反復処理し、それに応じてそれぞれを処理します

ただし、 get メソッドはスタックオーバーフローを引き起こし、デバッガーを介して実行すると、リターンステートメントにヒットして処理されたにもかかわらず、スタックが吹き飛ばされるまで何度も何度も実行されているように見えます

コードは次のとおりです。

public ICollection<History> History
    {
      get {
            if (HistoryKeyCount == 0)//HistoryKeyCount = Count of Parent List
            {
                    History = new List<Histories>();
            }
            else
            {
                History = new List<Histories>();//Created again because after each read object is dropped from memory
                foreach (HistoryKey x in ParentList)
                {
                    if (x.Key == null)
                    {
                        // Do nothing
                    }
                    else
                        History.Add(ObjectFinder.FindObject<ParentList>(x.Key));
                }

            }
            return History;
        }
        set {
            //Not implemented yet
            }
      }

get メソッドに入り、if ステートメントに到達し、新しいオブジェクトを作成し、それを返し、スタックオーバーフロー例外が発生するまで何度も繰り返します。

問題は ObjectFinder クラスや新しいメソッドの作成にあるのではなく、エラーが発生したときにこれらに到達することさえありません。

私は当初、if ステートメントの各インスタンスの後に新しいオブジェクトが作成されていると考えていましたが、問題が解決しない場合にのみ作成されるようにフラグを追加した後です。

以前にこの問題に遭遇した人はいますか? それは私が困惑しているからです!!

----編集--- 問題の原因である可能性が非常に高い.NET用のネイキッドオブジェクトフレームワークを使用していることを忘れていました

4

1 に答える 1

4

履歴内で履歴を呼び出すので、再帰的になります。

History.Add(ObjectFinder.FindObject<ParentList>(x.Key));

プロパティにコールバックし、同じ行に再び到達してから、スタックがなくなるまで自分自身を再度呼び出します。

また最後に、あなたは再び歴史に呼び戻します.....それは逃げることができません:)

ローカル変数が必要か、コレクションを保持して返すか、プライベートフィールドにリストを保持するかのいずれかが必要だと感じました。いずれにせよ、History内でHistoryを呼び出さないでください

于 2012-06-25T01:51:49.637 に答える