我创建了以下递归例程,以便在树视图中获取所有已检查的节点:
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)
,然后将其作为第二个参数传递给此例程。
我的问题是,我被告知这是“不太好”的编程实践 - 为什么以及可能出现什么问题?
这似乎是我能想到的最优雅的解决方案。
答案 0 :(得分:3)
无需传递列表ByRef
- 它已经是引用类型。只需按值传递它,您仍然可以向其添加选中的项目。
答案 1 :(得分:2)
这里更常见的解决方案是,而不是改变传入的集合,返回表示满足条件的所有节点的集合/序列。我个人认为IEnumerable
很适合这种情况,因为你可以使用迭代器块或只是将结果连接在一起,以便方法可选地自我添加,然后从递归调用返回所有内容。
这有几个好处。首先,它更容易打电话;没有必要创建一个列表,传入它,确保没有线程/并发修改问题,然后再使用它,你可以调用该方法并使用结果。
答案 2 :(得分:1)
问题在于其他程序员的期望以及您依赖副作用的事实(即对传入参数的更改)。
如果有人看到Get*
,则期望返回一个值。
您仍然可以使用递归函数,而不必依赖于更改传入的参数。