输出方法中定义的多个变量

时间:2014-11-19 12:36:14

标签: vb.net winforms visual-studio variables methods

我对表单加载事件触发的表单进行了一系列基本计算:

Dim someVariableA As Integer
Dim someVariableB As Integer
Dim someVariableX As Integer = 1
Dim someVariableY As Integer = 2 

someVariableA = someVariableX + someVariableY
someVariableB = someVariableX * someVariableY

我现在要求对单独表格进行精确计算。我可以用一种方法将计算放在两种形式都可以调用的方法中,而不是再次粘贴它吗?

Public Function someFunction()
    ' Above calculations placed here instead.
End Function

Private Sub someSub()
    ' Call calculations.
    someFunction()
    ' ...now output and use variables from function.
    TextBox1.Text = someVariableA
    TextBox2.Text = someVariableB
End Sub

最终,我期待像PHP一样的功能包括功能。

1 个答案:

答案 0 :(得分:1)

您遇到了Scope的问题。声明变量的位置决定了它的可用性。您可能知道如何使变量对表单中的所有方法都可见:

Public Class Form1
    Private varA As String
    Private var2 As Integer

这些将在表单中的所有方法中可用,因为它们在Form级别声明(与在本地仅存在的过程内声明的变量(Dim)不同)。要使它们对应用程序表单中的所有方法可见,请在模块中声明它们:

Public Module1
    Friend varA As String
    Friend var2 As Integer
    Friend varX As DateTime

在模块(20世纪80年代风格!)中声明,它们成为您应用的全局变量。但是有充分理由避免这种情况。改变一个值是如此容易,你可以有意外或无意中这样做的方法 - 记住它们现在对一切都是可见的,即使那些可能没有充分理由改变它们的程序!然后,您花时间尝试找到那些正在改变价值但不应该改变价值的方法。

OOP的一个巨大好处是能够通过使用类来保存数据包含管理数据的方法来避免这种情况 - 它们可以执行从加载和保存到您需要的计算的所有操作。这可能是您需要的标志是您有一些变量想要成为全局并且已经有方法是全局,将它们组合在一起并且您有一个类:

Public Class Foo
    Private varA As String
    Private var2 As Integer

    ' some of these things might be better as Properties
    ' this allows the subscribers (users of the class) to change the
    ' values directly:
    Public Property SomeDate As DateTime
    Public Property Name As String
    Public Property Value As Integer

    Public Function GetSomething(aVar As Integer) As Integer
       var2 += aVar         ' update var2 for example
       Return var2          ' return new value
    End Function

使课程适用于所有表格:

Public Module1
    Friend myFoo As Foo            ' makes it visible to all forms

然后从主窗体创建一个类的实例:

Public Class Form1
    Private Sub Form_Load(....
       myFoo = new Foo

现在,myFooFoo类的一个实例,它不仅包含这些变量,还包含管理它们的方法:

Private Sub button_click(....
     someVar = myFoo.DoSomething(42)