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),然后将它作为第二个参数传递到这个例程中。我的问题是有人告诉我这是“不是很好”的编程实践——为什么以及会出现什么问题?

这似乎是我能想出的最优雅的解决方案来让它发挥作用。

4

3 回答 3

3

不需要传递列表ByRef——它已经是一个引用类型。只需按值传递它,您仍然可以将选中的项目添加到它。

于 2013-01-07T20:10:11.687 回答
2

这里更常见的解决方案是,而不是改变传入的集合,而是返回代表所有满足条件的节点的集合/序列。我个人认为IEnumerable很适合这种情况,因为您可以使用迭代器块或将结果连接在一起,以便该方法可以选择添加自身,然后从递归调用中返回所有内容。

这有几个好处。第一,更容易调用;无需创建列表,传入,确保没有线程/并发修改问题,然后使用它,您可以调用方法并使用结果。

于 2013-01-07T20:19:27.083 回答
1

问题在于其他程序员的期望以及您依赖副作用(即更改传入参数)的事实。

当有人看到 aGet*时,期望它会返回一个值。

您仍然可以使用递归函数,而不必依赖更改传入的参数。

于 2013-01-07T20:11:02.123 回答