1

ツリービューでチェックされたすべてのノードを取得するために、次の再帰ルーチンを作成しました。

    Sub GetAllCheckedNodes(ByVal tn As TreeNode, ByRef NodesList As List(Of TreeNode))
        If tn.Checked Then NodesList.Add(tn)

        For Each nd As TreeNode In tn.Nodes
            GetAllCheckedNodes(nd, NodesList)
        Next
    End Sub

基本的に、私がそれを使用する方法は、空を宣言してからList(Of Treenode)、2 番目の引数としてこのルーチンに渡すことです。私の質問は、これは「良くない」プログラミング手法だと言われたということです。なぜ、何がうまくいかないのでしょうか?

これを機能させるために思いついた最もエレガントなソリューションのようです。

4

3 に答える 3

3

リストを渡す必要はありませんByRef。すでに参照型になっています。値で渡すだけで、チェック済みの項目を追加できます。

于 2013-01-07T20:10:11.687 に答える
2

ここでのより一般的な解決策は、渡されたコレクションを変更するのではなく、条件を満たすすべてのノードを表すコレクション/シーケンスを返すことです。IEnumerable個人的には、反復子ブロックを使用するか、結果を連結して、メソッドがオプションでそれ自体を追加し、再帰呼び出しからすべてを返すようにすることができるため、この状況に適している と思います。

これにはいくつかの利点があります。まず、呼び出しが簡単です。リストを作成して渡し、スレッド化/同時変更の問題がないことを確認してから後で使用する必要はありません。メソッドを呼び出して結果を使用するだけです。

于 2013-01-07T20:19:27.083 に答える
1

問題は、他のプログラマーからの期待と、副作用 (つまり、渡されたパラメーターの変更) に依存しているという事実です。

誰かが を見たとき、それが値を返すGet*ことが期待されます。

再帰関数を引き続き使用でき、渡されたパラメーターの変更に依存する必要はありません。

于 2013-01-07T20:11:02.123 に答える