0

このコードにより、ユーザーはパラメーターとその値を設定できます。値は、別のパラメータへの参照である場合があります。

Parameter.Set("Parameter1", "%Parameter2%");
Parameter.Set("Parameter2", "%Parameter1%");

この値の実際の解決では、Regex クラスの Replace メソッドを使用して、% 記号内のすべての参照を再帰的に解決し、それらを置き換えます。

// Pseudo code (the actual parameter name is retrieved and replaced with its value.
Regex.Replace("%Parameter1%", match => Parameter.Get(match));

この場合、循環参照により StackOverflowException が発生します。

どうすればこれを回避できますか? (循環参照が検出された場合 - 何らかの方法で例外/ハンドルをスローします)

提案された実装は、現在の解決実行で既に検索された用語のリストを保持することでした (「検索履歴」)。

各ステップで、現在検索されているパラメーターが履歴にあるかどうかを確認します。履歴にある場合は、既に確認済みであり、循環している必要があります。

このアプローチの欠点は、無駄が多いことです (発生するパラメーター解決ごとに新しいリストを割り当てます)。

4

1 に答える 1

1

上で提案したように、再帰メソッドのシグネチャを のように書き換えParameter.Get(string, int)ます。int を再帰深度カウンターとして使用します。メソッドがより深いパラメーターを評価する必要があるたびに、int 変数をデクリメントします。0 になると、パラメータの処理を停止します。20 個の再帰的パラメーターを使用する人はほとんどいないため、int の初期値はかなり小さい数値になる可能性があります。

于 2012-05-30T17:27:16.817 に答える