将对象ByRef传递给sub而不是使用函数 - 这是不好的编程习惯......为什么?

时间:2013-01-07 20:07:46

标签: .net vb.net oop

我创建了以下递归例程,以便在树视图中获取所有已检查的节点:

    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),然后将其作为第二个参数传递给此例程。 我的问题是,我被告知这是“不太好”的编程实践 - 为什么以及可能出现什么问题?

这似乎是我能想到的最优雅的解决方案。

3 个答案:

答案 0 :(得分:3)

无需传递列表ByRef - 它已经是引用类型。只需按值传递它,您仍然可以向其添加选中的项目。

答案 1 :(得分:2)

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

这有几个好处。首先,它更容易打电话;没有必要创建一个列表,传入它,确保没有线程/并发修改问题,然后再使用它,你可以调用该方法并使用结果。

答案 2 :(得分:1)

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

如果有人看到Get*,则期望返回一个值。

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