Vb.net 实例变量和局部变量混淆
请看下面的样本1: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
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,谢谢。