Vb.net 实例变量和局部变量混淆

Vb.net 实例变量和局部变量混淆,vb.net,Vb.net,请看下面的样本1: Public Class LocalVariable Public Sub Run() Dim TestVariable As Integer TestVariable = Method1(TestVariable) TestVariable = Method2(TestVariable) TestVariable = Method3(TestVariable) End Sub Pri

请看下面的样本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应该在函数之间共享?因此,应使用实例变量。

这两个示例的含义不同。

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

还有第三个选项

在其他条件相同的情况下,我还推荐这两个选项中的示例1方法。然而,实例和局部变量并不是区别。示例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

这两个样本的含义不同。

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

还有第三个选项

在其他条件相同的情况下,我还推荐这两个选项中的示例1方法。然而,实例和局部变量并不是区别。示例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

谢谢代码以某种形式存在这一事实与此无关。我已经编辑了问题中的代码。你能再看看吗?再次感谢。好的,最后的答案。现在需要继续实际分配的工作。谢谢。最后,您会在自己的应用程序中使用示例1还是示例3?我意识到这在某种程度上取决于问题域。1和3有不同的行为。我会选择哪一种完全取决于我需要的行为。两个都不比另一个好。谢谢。代码以某种形式存在这一事实与此无关。我已经编辑了问题中的代码。你能再看看吗?再次感谢。好的,最后的答案。现在需要继续实际分配的工作。谢谢。最后,您会在自己的应用程序中使用示例1还是示例3?我意识到这在某种程度上取决于问题域。1和3有不同的行为。我会选择哪一种完全取决于我需要的行为。两个都不比另一个好。我们很清楚:示例1有一个局部变量。它是特定函数的局部函数。示例2有一个实例变量,因为它的作用域是类型的特定实例。我想也许你的术语是倒退的。在示例1中,TestVariable从未“在函数之间共享”。作为值类型,为每个函数调用创建一个副本。即使它是通过ByRef传递的,但由于结构化编程规则,一次只能在一个方法中传递:一个方法在调用下一个方法之前返回。@Joel Coehoorn,谢谢。