String private sub能否将新创建的变量传递给main()?

String private sub能否将新创建的变量传递给main()?,string,vb.net,module,parameter-passing,main,String,Vb.net,Module,Parameter Passing,Main,在接收到main的值后,与main位于同一模块中的私有子程序能否创建新变量并将其传递回main 这就是我试图做的,但我遇到了一些困难。 例如,在下面的testSUB中,我修改了字符串。我可以将extraSTRING和newSTRING传递回main吗?任何例子都会有帮助 Module module1 Sub main() Dim l As String Dim I As Long = 1 Dim A As String te

在接收到main的值后,与main位于同一模块中的私有子程序能否创建新变量并将其传递回main

这就是我试图做的,但我遇到了一些困难。 例如,在下面的testSUB中,我修改了字符串。我可以将extraSTRING和newSTRING传递回main吗?任何例子都会有帮助

Module module1
    Sub main()
        Dim l As String
        Dim I As Long = 1
        Dim A As String
        testsub(l, A, I)
    End Sub

    Private Sub testSub(l As String, A As String, I As Long)
        Dim extraSTRING As String = "extraTEXT"
        Dim newSTRING As String = l & extraSTRING
    End Sub
End Module

要返回值,可以将
子项
转换为
函数

Private Function testFunction (ByVal arg1 As String) As String

    Return arg1 & " and some more text"

End Function
要调用上述
函数
并分配返回的值,请使用以下代码:

Dim a As String = testFunction("some text")

'Output:
'a = "some text and some more text"
下面是带有输出的代码的屏幕截图:

或者,您可以使用:

指定以被调用过程可以更改调用代码中作为参数基础的变量的值的方式传递参数

ByRef
与以下内容略有不同:

指定以被调用过程或属性无法更改调用代码中作为参数基础的变量的值的方式传递参数

下面是一些示例代码,向您展示了操作中的差异:

Module Module1

    Sub Main()
        Dim a As Integer = 0
        Dim b As Integer = 0
        Dim c As Integer = 0

        testSub(a, b, c)

        'Output:
        'a = 0
        'b = 0
        'c = 3

    End Sub

    Private Sub testSub(arg1 As Integer, ByVal arg2 As Integer, ByRef arg3 As Integer)
        arg1 = 1
        arg2 = 2
        arg3 = 3
    End Sub

End Module
通过在
VB.NET
中不指定
修饰符(如上面的
arg1
所示),编译器默认将使用
ByVal

这里值得注意的是,尽管默认情况下,
VB.NET
使用
ByVal
,但如果未指定,
VBA
不使用,而是默认使用
ByRef
。如果您将代码从一个端口传输到另一个端口,请注意这一点

下面是带有输出的代码的屏幕截图:

以您的代码为例:

Sub main()
    Dim l As String
    Dim A As String
    Dim I As Long = 1
    testSub(l, A, I)
End Sub
要传递变量
l
A
I
并更改其值,您需要更改使用修饰符
ByRef
的方法

Private Sub testSub(ByRef l As String, ByRef A As String, ByRef I As Long)
    l = "TEXT"
    A = "extra" & l
    I = 100
End Sub
下面是带有输出的代码的屏幕截图:


要返回值,可以将
子项
转换为
函数

Private Function testFunction (ByVal arg1 As String) As String

    Return arg1 & " and some more text"

End Function
要调用上述
函数
并分配返回的值,请使用以下代码:

Dim a As String = testFunction("some text")

'Output:
'a = "some text and some more text"
下面是带有输出的代码的屏幕截图:

或者,您可以使用:

指定以被调用过程可以更改调用代码中作为参数基础的变量的值的方式传递参数

ByRef
与以下内容略有不同:

指定以被调用过程或属性无法更改调用代码中作为参数基础的变量的值的方式传递参数

下面是一些示例代码,向您展示了操作中的差异:

Module Module1

    Sub Main()
        Dim a As Integer = 0
        Dim b As Integer = 0
        Dim c As Integer = 0

        testSub(a, b, c)

        'Output:
        'a = 0
        'b = 0
        'c = 3

    End Sub

    Private Sub testSub(arg1 As Integer, ByVal arg2 As Integer, ByRef arg3 As Integer)
        arg1 = 1
        arg2 = 2
        arg3 = 3
    End Sub

End Module
通过在
VB.NET
中不指定
修饰符(如上面的
arg1
所示),编译器默认将使用
ByVal

这里值得注意的是,尽管默认情况下,
VB.NET
使用
ByVal
,但如果未指定,
VBA
不使用,而是默认使用
ByRef
。如果您将代码从一个端口传输到另一个端口,请注意这一点

下面是带有输出的代码的屏幕截图:

以您的代码为例:

Sub main()
    Dim l As String
    Dim A As String
    Dim I As Long = 1
    testSub(l, A, I)
End Sub
要传递变量
l
A
I
并更改其值,您需要更改使用修饰符
ByRef
的方法

Private Sub testSub(ByRef l As String, ByRef A As String, ByRef I As Long)
    l = "TEXT"
    A = "extra" & l
    I = 100
End Sub
下面是带有输出的代码的屏幕截图:


在本例中,您的目标并不明确。但是,您可以将testSub转换为函数并以这种方式返回某些内容。或者你可以使用传递的参数。@Jinx88909:在我看来,这就是他想要的。你应该用这两个选项写一个答案。@VisualIncent作为答案发布。在我的手机上,所以希望我没有犯任何错误。不那么容易:)当一个子例程接受参数时,它可以通过以下两种方式中的一种实现:Byref或byval。Byval是默认值,意味着您传递的值将在内存中复制。Byref表示要传递内存地址或指针。当子例程作用于一个参考值时,调用者自然会注意到对该值的修改@Jinx88909已经回答了您的问题。或者,您可以简单地编写一个函数而不是子函数。私有声明意味着它只能在该模块中使用。@Jinx88909:Heh,我几乎所有的答案都是从手机中编写的。;)在这个例子中,不清楚你在追求什么。但是,您可以将testSub转换为函数并以这种方式返回某些内容。或者你可以使用传递的参数。@Jinx88909:在我看来,这就是他想要的。你应该用这两个选项写一个答案。@VisualIncent作为答案发布。在我的手机上,所以希望我没有犯任何错误。不那么容易:)当一个子例程接受参数时,它可以通过以下两种方式中的一种实现:Byref或byval。Byval是默认值,意味着您传递的值将在内存中复制。Byref表示要传递内存地址或指针。当子例程作用于一个参考值时,调用者自然会注意到对该值的修改@Jinx88909已经回答了您的问题。或者,您可以简单地编写一个函数而不是子函数。私有声明意味着它只能在该模块中使用。@Jinx88909:Heh,我几乎所有的答案都是从手机中编写的。;)谢谢你的例子,谢谢你的展示。它很清楚地回答了我的问题。谢谢你的例子。谢谢你的展示。它清楚地说明了这一点,并回答了我的问题。