实例变量和局部变量混淆

时间:2013-05-09 18:54:20

标签: vb.net

请看下面的示例1:

Public Class LocalVariable

    Public Sub Run()
        Dim TestVariable As Integer
        TestVariable = Method1(TestVariable)
        TestVariable = Method2(TestVariable)
        TestVariable = Method3(TestVariable)
    End Sub

    Private Function Method1(ByVal x As Integer) As Integer
        Return x + 1
    End Function

    Private Function Method2(ByVal x As Integer) As Integer
        Return x + 2
    End Function

    Private Function Method3(ByVal x As Integer) As Integer
        Return x + 3
    End Function

End Class

和下面的示例2:

Public Class InstanceVariable

    Dim TestVariable As Integer

    Public Sub Run()
        Method1()
        Method2()
        Method3()
    End Sub

    Private Sub Method1()
        TestVariable = TestVariable + 1
    End Sub

    Private Sub Method2()
        TestVariable = TestVariable + 2
    End Sub

    Private Sub Method3()
        TestVariable = TestVariable + 3
    End Sub

End Class

每个程序运行后结果显然是相同的,即TestVariable = 6。我在网上和工作中找到的每个例子都使用了样本1.当然,这是对实例变量的误用,因为TestVariable应该跨函数共享?因此,应该使用实例变量。

1 个答案:

答案 0 :(得分:4)

这两个样本并不意味着相同。

如果在程序的整个生命周期中多次调用Run(),会发生什么不同。示例2中的Run()方法永远不会重置TestVariable,因此它将继续变得越来越大。在示例1中,结果将始终为6,因为TestVariable是每次调用函数的新变量。哪个更正确取决于完全你想要做什么。

还有第三个选项

在其他条件相同的情况下,我也建议从这两个选项中采用样本1方法。但是,实例vs局部变量不是区别。样本1没有理由不能将实例变量与这些方法定义一起使用。所以我们的第三个选项看起来像这样:

Public Class InstanceVariableWithSampleOneFunctions

    Dim TestVariable As Integer

    Public Sub Run()
        TestVariable = Method1(TestVariable)
        TestVariable = Method2(TestVariable)
        TestVariable = Method3(TestVariable)
    End Sub

    Private Function Method1(ByVal x As Integer) As Integer
        Return x + 1
    End Function

    Private Function Method2(ByVal x As Integer) As Integer
        Return x + 2
    End Function

    Private Function Method3(ByVal x As Integer) As Integer
        Return x + 3
    End Function
End Class

这使用样本2中的实例变量和样本1中的方法。我将其称为样本3。

这样可以更好地处理问题的核心,因为现在样本3具有与样本2相同的行为。是否应该选择1或2取决于您需要的行为。但是你应该选择2还是3取决于编码风格的优点。 2和3都依赖于Run()方法中的实例变量,但2也在其他方法中使用实例变量,而3使用局部变量。

我可以说,在这一点上,比较2和3,我肯定更喜欢样本3.样本3中的方法有更多的功能样式:接受输入,返回输出。这为他们提供了更高级别的抽象,这使得重构样本3变得更容易,例如将这些方法移动到其他地方......比如说,实用程序类可以与样本1和3共享一组方法。你提到了线程,通常这种风格使得正确地进行多线程变得更容易,而不是更难。

这种方法风格更好的一个具体例子是可组合。这个属性允许我像这样重写样本3的Run()方法,并且有信心得到相同的结果:

Public Sub Run()
    TestVariable = Method3(Method2(Method1(TestVariable)))
End Sub